TNB Library
TnbRecoveryFiles.h
[詳解]
1#pragma once
13#include "TnbFileName.h"
14#include "TnbStrVector.h"
15
16
17
18//TNB Library
19namespace TNB
20{
21
22
23
37{
38public:
39
44 CRecoveryFiles(bool isDefaultRecoveryMode = false) : m_isDefaultRecoveryMode(isDefaultRecoveryMode)
45 {
46 }
47
50 {
51 if ( m_isDefaultRecoveryMode )
52 {
53 RecoverAll();
54 }
55 else
56 {
58 }
59 }
60
69 bool Register(LPCTSTR lpszFile)
70 {
71 CFileName fn(lpszFile);
72 if ( fn.IsExist() )
73 {
74 CStr bak;
75 loop ( i, 0x10000 )
76 {
77 bak = fn.GetFullName() + CStr::Fmt(_T(".%04X.bak"), i);
78 if ( ! m_Exist(bak) )
79 {
80 break;
81 }
82 }
83 if ( fn.CopyTo(bak) )
84 {
85 TParam p(fn.GetFullName(), bak);
86 p.backHandle = ::CreateFile(bak, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
87 m_names.Add(p);
88 return true;
89 }
90 }
91 return false;
92 }
93
100 bool UnregisterAll(void)
101 {
102 bool r = true;
103 loop ( i, m_names.GetSize() )
104 {
105 m_names[i].backHandle.Null();
106 r &= !! ::DeleteFile(m_names[i].backName);
107 }
108 m_names.RemoveAll();
109 return r;
110 }
111
119 bool RecoverAll(void)
120 {
121 bool r = true;
122 //== 先にtmpファイル作成
123 loop ( i, m_names.GetSize() )
124 {
125 CStr reg = m_names[i].registName;
126 if ( m_Exist(reg) )
127 {
128 CStr tmp;
129 loop ( ii, 0x10000 )
130 {
131 tmp = reg + CStr::Fmt(_T(".%04X.tmp"), ii);
132 if ( ! m_Exist(tmp) )
133 {
134 break;
135 }
136 }
137 if ( ! ::MoveFile(reg, tmp) )
138 {
139 _GetLastError("MoveFile");
140 m_names[i].tempName.Empty();
141 r = false;
142 }
143 else
144 {
145 m_names[i].tempName = tmp;
146 }
147 }
148 }
149 //== tmpファイルが出来たものはbakをオリジナルにリネームし、tmpを削除。
150 loop ( i, m_names.GetSize() )
151 {
152 m_names[i].backHandle.Null();
153 if ( ::MoveFile(m_names[i].backName, m_names[i].registName) )
154 {
155 if ( ! m_names[i].tempName.IsEmpty() )
156 {
157 VERIFY( ::DeleteFile(m_names[i].tempName) );
158 }
159 }
160 else
161 {
162 // 意図的に bak ファイルを消した場合など.
163 r = false;
164 }
165 }
166 m_names.RemoveAll();
167 return r;
168 }
169
170private:
172 bool m_Exist(LPCTSTR lpszName) const
173 {
174 WIN32_FIND_DATA t;
175 HANDLE h = ::FindFirstFile(lpszName, &t);
176 if ( h != INVALID_HANDLE_VALUE )
177 {
178 ::FindClose(h);
179 return true;
180 }
181 return false;
182 }
184 struct TParam
185 {
186 CStr registName;
187 CStr backName;
188 CHandleHandle backHandle;
189 CStr tempName;
190 TParam(LPCTSTR reg = NULL, LPCTSTR tmp = NULL) : registName(reg), backName(tmp)
191 {
192 }
193 };
194 CVectorT<TParam> m_names;
195 bool m_isDefaultRecoveryMode;
196 friend class CRecoveryFilesTest;
197};
198
199
200
201}; // TNB
202
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
ファイルネーム関係のヘッダ
文字列情報配列管理関係のヘッダ
ファイル名管理クラス
Definition: TnbFileName.h:59
bool CopyTo(LPCTSTR lpszNew, bool boIsAllowUndo=false, bool boIsSilent=true)
[操作] コピー.
Definition: TnbFileName.h:714
bool IsExist(void) const
[確認] 有無チェック
Definition: TnbFileName.h:455
CStr GetFullName(void) const
[取得] フルName名取得
Definition: TnbFileName.h:184
HANDLE型ハンドルハンドル
リカバリーファイルズクラス
~CRecoveryFiles(void)
デストラクタ
bool UnregisterAll(void)
[設定] 登録解除.
bool RecoverAll(void)
[設定] リカバー.
CRecoveryFiles(bool isDefaultRecoveryMode=false)
コンストラクタ
bool Register(LPCTSTR lpszFile)
[設定] 登録.
static CStrT Fmt(const TCHAR *lpszFormat,...)
[作成] 書式付き文字列作成
Definition: TnbStr.h:1206
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbVector.h:368
virtual bool RemoveAll(void)
[削除] 空化
Definition: TnbVector.h:565
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
TNB Library
Definition: TnbDoxyTitle.txt:2
bool IsEmpty(void) const
[確認] 要素の有無確認.