11using namespace Microsoft::VisualStudio::CppUnitTestFramework;
18 TEST_CLASS_INITIALIZE (ClassInitialize)
20 Logger::WriteMessage (
"FileUtilityTest class initialize.\n");
23 TEST_CLASS_CLEANUP (ClassCleanup)
25 Logger::WriteMessage (
"FileUtilityTest class cleanup.\n");
28 TEST_METHOD_INITIALIZE (MethodInitialize)
30 Logger::WriteMessage (
"FileUtilityTest method initialize.\n");
33 TEST_METHOD_CLEANUP (MethodCleanup)
35 Logger::WriteMessage (
"FileUtilityTest method cleanup.\n");
42 output.
Format (_T (
"%s %s %lld\n"),
46 Logger::WriteMessage (output.
Ctr ());
55 output.
Format (_T (
"D(%d) R(%d) H(%d) S(%d) A(%d) T(%d) C(%d)\n"),
56 isDirectory, isReadOnly, isHidden, isSystem,
57 isArchive, isTemporary, isCompressed);
58 Logger::WriteMessage (output.
Ctr ());
61 output.
Format (_T (
"CT:%04d/%02d/%02d %02d:%02d:%02d.%03d\n"),
62 ct.wYear, ct.wMonth, ct.wDay,
63 ct.wHour, ct.wMinute, ct.wSecond,
65 Logger::WriteMessage (output.
Ctr ());
68 output.
Format (_T (
"UT:%04d/%02d/%02d %02d:%02d:%02d.%03d\n"),
69 ut.wYear, ut.wMonth, ut.wDay,
70 ut.wHour, ut.wMinute, ut.wSecond,
72 Logger::WriteMessage (output.
Ctr ());
75 output.
Format (_T (
"AT:%04d/%02d/%02d %02d:%02d:%02d.%03d\n"),
76 at.wYear, at.wMonth, at.wDay,
77 at.wHour, at.wMinute, at.wSecond,
79 Logger::WriteMessage (output.
Ctr ());
81 Logger::WriteMessage (_T (
"\n"));
90 Logger::WriteMessage (
"FileUtility::DirectoryWatch() returns error.\n");
94 output.
Format (_T (
"%s %lld\n"),
97 Logger::WriteMessage (output.
Ctr ());
106 output.
Format (_T (
"D(%d) R(%d) H(%d) S(%d) A(%d) T(%d) C(%d)\n"),
107 isDirectory, isReadOnly, isHidden, isSystem,
108 isArchive, isTemporary, isCompressed);
109 Logger::WriteMessage (output.
Ctr ());
111 BOOL isAdded = item.
IsAdded ();
116 output.
Format (_T (
"Added(%d) Removed(%d) Modified(%d) OldName(%d) NewName(%d)\n"),
117 isAdded, isRemoved, isModified, isOldName, isNewName);
118 Logger::WriteMessage (output.
Ctr ());
121 output.
Format (_T (
"CT:%04d/%02d/%02d %02d:%02d:%02d.%03d\n"),
122 ct.wYear, ct.wMonth, ct.wDay,
123 ct.wHour, ct.wMinute, ct.wSecond,
125 Logger::WriteMessage (output.
Ctr ());
128 output.
Format (_T (
"UT:%04d/%02d/%02d %02d:%02d:%02d.%03d\n"),
129 ut.wYear, ut.wMonth, ut.wDay,
130 ut.wHour, ut.wMinute, ut.wSecond,
132 Logger::WriteMessage (output.
Ctr ());
135 output.
Format (_T (
"AT:%04d/%02d/%02d %02d:%02d:%02d.%03d\n"),
136 at.wYear, at.wMonth, at.wDay,
137 at.wHour, at.wMinute, at.wSecond,
139 Logger::WriteMessage (output.
Ctr ());
143 Logger::WriteMessage (_T (
"\n"));
146 TEST_METHOD (DeleteTest)
153 tempFolder.
Ctr (), _T (
"FUTL"), 0);
154 Logger::WriteMessage (tempFile.
Ctr ());
155 Logger::WriteMessage (_T (
"\n"));
158 Assert::IsTrue (ret, _T (
"テンポラリファイルが作成されませんでした。\n"));
161 Assert::IsTrue (ret, _T (
"failed Delete()\n"));
164 Assert::IsFalse (ret, _T (
"failed Delete(). still file is exist.\n"));
167 TEST_METHOD (CopyTest)
174 tempFolder.
Ctr (), _T (
"FUTL"), 0);
175 Logger::WriteMessage (tempFile.
Ctr ());
176 Logger::WriteMessage (_T (
"\n"));
179 Assert::IsTrue (ret, _T (
"テンポラリファイルが作成されませんでした。\n"));
183 tempFolder.
Ctr (), _T (
"FUTL"), 1);
184 Logger::WriteMessage (tempFile2.
Ctr ());
185 Logger::WriteMessage (_T (
"\n"));
188 Assert::IsTrue (ret, _T (
"failed Copy()\n"));
191 Assert::IsTrue (ret, _T (
"failed Copy(). file is not copied.\n"));
197 TEST_METHOD (MoveTest)
204 tempFolder.
Ctr (), _T (
"FUTL"), 0);
205 Logger::WriteMessage (tempFile.
Ctr ());
206 Logger::WriteMessage (_T (
"\n"));
209 Assert::IsTrue (ret, _T (
"テンポラリファイルが作成されませんでした。\n"));
213 tempFolder.
Ctr (), _T (
"FUTL"), 1);
214 Logger::WriteMessage (tempFile2.
Ctr ());
215 Logger::WriteMessage (_T (
"\n"));
218 Assert::IsTrue (ret, _T (
"failed Move()\n"));
221 Assert::IsTrue (ret, _T (
"failed Move(). file is not moved.\n"));
224 Assert::IsFalse (ret, _T (
"failed Move(). file is still exist.\n"));
230 TEST_METHOD (MakeAndRemoveDirTest)
237 tempFolder.
Ctr (), _T (
"FUTL"), 1);
238 Logger::WriteMessage (tempFile.
Ctr ());
239 Logger::WriteMessage (_T (
"\n"));
242 Assert::IsTrue (ret, _T (
"failed MakeDir()\n"));
245 Assert::IsTrue (ret, _T (
"failed MakeDir()\n"));
248 Assert::IsTrue (ret, _T (
"failed MakeDir()\n"));
251 Assert::IsTrue (ret, _T (
"failed RemoveDir()\n"));
254 Assert::IsFalse (ret, _T (
"failed RemoveDir()\n"));
257 TEST_METHOD (FindTest1)
263 for (
auto& item : response)
265 ShowFileInformation1 (item);
266 if (++i == 100)
break;
271 TEST_METHOD (FindTest2)
273 LPCTSTR lpctszFolder = _T (
"C:\\Windows\\system32");
274 LPCTSTR lpctszFile = _T (
"*.cpl");
277 for (
auto& item : response)
279 ShowFileInformation1 (item);
280 if (++i == 100)
break;
285 TEST_METHOD (FindTest3)
287 LPCTSTR lpctszFolder = _T (
"C:\\Windows\\system32");
288 LPCTSTR lpctszFile = _T (
"*");
291 for (
auto& item : response)
293 ShowFileInformation1 (item);
294 if (++i == 100)
break;
299 TEST_METHOD (Find2Test3)
301 LPCTSTR lpctszFolder = _T (
"C:\\Windows\\system32");
302 LPCTSTR lpctszFile = _T (
"*");
307 for (
auto& item : response)
309 ShowFileInformation1 (item);
310 if (++i == 100)
break;
315 TEST_METHOD (DirectoryWatchTest)
319 auto watchFunction = [](LPVOID lpvParam)->DWORD
321 Response* response =
static_cast<Response*
>(lpvParam);
326 Logger::WriteMessage (_T (
"[watchFunction] finished.\n"));
330 auto eventFunction = [](LPVOID lpvParam)->DWORD
334 Logger::WriteMessage (temporaryPath.
Ctr ());
337 for (
int i = 1; i <= 5; i++)
340 Logger::WriteMessage (temporaryFileName.
Ctr ());
341 Logger::WriteMessage (_T (
"\n"));
343 ret = temporaryFile.
Create (temporaryFileName.
Ctr (), GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE, CREATE_ALWAYS);
344 Assert::IsTrue (ret, _T (
"File::Create() failed.\n"));
345 Logger::WriteMessage (_T (
"[eventFunction] file created.\n"));
347 BYTE byData[]{ 1,2,3,4,5,6,7,8,9,10 };
348 DWORD dwSize = temporaryFile.
Write (byData,
sizeof (byData));
349 Logger::WriteMessage (_T (
"[eventFunction] file modified.\n"));
351 ret = temporaryFile.
Close ();
352 Assert::IsTrue (ret, _T (
"File::Close() failed.\n"));
353 Logger::WriteMessage (_T (
"[eventFunction] file closed.\n"));
356 Assert::IsTrue (ret, _T (
"FileUtility::Delete() failed.\n"));
357 Logger::WriteMessage (_T (
"[eventFunction file deleted.\n"));
362 Logger::WriteMessage (_T (
"[eventFunction] finished.\n"));
368 Assert::IsTrue (watchThread.
Create (watchFunction, (LPVOID)&response));
371 Assert::IsTrue (eventThread.
Create (eventFunction));
373 Assert::AreEqual<DWORD> (WAIT_OBJECT_0, eventThread.
Wait (), _T (
"eventThread.Wait() failed."));
374 Logger::WriteMessage (_T (
"[eventThread] finished.\n"));
376 Assert::AreEqual<DWORD> (WAIT_OBJECT_0, watchThread.
Wait (), _T (
"watchThread.Wait() failed."));
377 Logger::WriteMessage (_T (
"[watchThread] finished.\n"));
379 for (
auto& item : response)
381 ShowFileInformation2 (item);
385#if defined (_MSC_VER) && (_MSC_VER >= 1910)
412 TEST_METHOD (HardLinkFileTest)
415 LPCTSTR lpctszBase = _T (
".\\WindowsLibrary.dll");
416 LPCTSTR lpctszTarget = _T (
".\\linkBase.bin");
417 LPCTSTR lpctszSymlink = _T (
".\\linkHard.bin");
420 Assert::IsTrue (ret, _T (
"FileUtility::Copy() failed.\n"));
422 Assert::IsTrue (ret, _T (
"FileUtility::MakeHardLink() failed.\n"));
424 Assert::IsTrue (ret, _T (
"FileUtility::Delete() failed.\n"));
426 Assert::IsTrue (ret, _T (
"FileUtility::Delete() failed.\n"));
429 TEST_METHOD (GetTemporaryPathTest)
432 Logger::WriteMessage (response.
Ctr ());
433 Logger::WriteMessage (
"\n");
436 TEST_METHOD (GetTemporaryFileNameTest)
443 Logger::WriteMessage (response.
Ctr ());
444 Logger::WriteMessage (
"\n");
452 Logger::WriteMessage (response.
Ctr ());
453 Logger::WriteMessage (
"\n");
458 TEST_METHOD (GetAbsolutePathTest1)
462 Logger::WriteMessage (response.
Ctr ());
463 Logger::WriteMessage (_T (
"\n"));
466 TEST_METHOD (GetAbsolutePathTest2)
470 Logger::WriteMessage (response.
Ctr ());
471 Logger::WriteMessage (_T (
"\n"));
474 TEST_METHOD (SHFileOperationsCopy)
480 temporaryPath1 += _T (
"\\CopyTest1");
482 Assert::IsTrue (ret, _T (
"FileUtility::MakeDir() failed.\n"));
483 Logger::WriteMessage (temporaryPath1.
Ctr ());
487 for (
int i = 0; i < 10; i++)
490 Logger::WriteMessage (temporaryFileName.
Ctr ());
491 Logger::WriteMessage (_T (
"\n"));
494 ret = temporaryFile.
Create (temporaryFileName.
Ctr (), GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE, CREATE_ALWAYS);
495 Assert::IsTrue (ret, _T (
"File::Create() failed.\n"));
496 Logger::WriteMessage (_T (
"file created.\n"));
498 BYTE byData[]{ 1,2,3,4,5,6,7,8,9,10 };
499 DWORD dwSize = temporaryFile.
Write (byData,
sizeof (byData));
500 Logger::WriteMessage (_T (
"file modified.\n"));
502 ret = temporaryFile.
Close ();
503 Assert::IsTrue (ret, _T (
"File::Close() failed.\n"));
504 Logger::WriteMessage (_T (
"file closed.\n"));
509 temporaryPath2 += _T (
"\\CopyTest2");
510 Logger::WriteMessage (temporaryPath2.
Ctr ());
522 TEST_METHOD (SHFileOperationsMove)
528 temporaryPath1 += _T (
"\\CopyTest1");
530 Assert::IsTrue (ret, _T (
"FileUtility::MakeDir() failed.\n"));
531 Logger::WriteMessage (temporaryPath1.
Ctr ());
535 for (
int i = 0; i < 10; i++)
538 Logger::WriteMessage (temporaryFileName.
Ctr ());
539 Logger::WriteMessage (_T (
"\n"));
542 ret = temporaryFile.
Create (temporaryFileName.
Ctr (), GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE, CREATE_ALWAYS);
543 Assert::IsTrue (ret, _T (
"File::Create() failed.\n"));
544 Logger::WriteMessage (_T (
"file created.\n"));
546 BYTE byData[]{ 1,2,3,4,5,6,7,8,9,10 };
547 DWORD dwSize = temporaryFile.
Write (byData,
sizeof (byData));
548 Logger::WriteMessage (_T (
"file modified.\n"));
550 ret = temporaryFile.
Close ();
551 Assert::IsTrue (ret, _T (
"File::Close() failed.\n"));
552 Logger::WriteMessage (_T (
"file closed.\n"));
557 temporaryPath2 += _T (
"\\CopyTest2");
558 Logger::WriteMessage (temporaryPath2.
Ctr ());
571 TEST_METHOD (SHFileOperationsDelete)
577 temporaryPath += _T (
"\\DeleteTest");
579 Assert::IsTrue (ret, _T (
"FileUtility::MakeDir() failed.\n"));
580 Logger::WriteMessage (temporaryPath.
Ctr ());
584 for (
int i = 0; i < 10; i++)
587 Logger::WriteMessage (temporaryFileName.
Ctr ());
588 Logger::WriteMessage (_T (
"\n"));
591 ret = temporaryFile.
Create (temporaryFileName.
Ctr (), GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE, CREATE_ALWAYS);
592 Assert::IsTrue (ret, _T (
"File::Create() failed.\n"));
593 Logger::WriteMessage (_T (
"file created.\n"));
595 BYTE byData[]{ 1,2,3,4,5,6,7,8,9,10 };
596 DWORD dwSize = temporaryFile.
Write (byData,
sizeof (byData));
597 Logger::WriteMessage (_T (
"file modified.\n"));
599 ret = temporaryFile.
Close ();
600 Assert::IsTrue (ret, _T (
"File::Close() failed.\n"));
601 Logger::WriteMessage (_T (
"file closed.\n"));
ファイルハンドルを伴わないファイルIOに関するWindowsAPIを集約した クラス
スレッドに関するWindowsAPIを集約したクラス
ファイルIOに関するWindowsAPIを集約したクラス
BOOL APIENTRY Create(LPCTSTR lpctszFileName, DWORD dwDesiredAccess, DWORD dwShareMode, DWORD dwCreationDisposition)
ファイルを作成、オープンします。
FileUtility::Find()が返すファイル情報
const FILETIME &APIENTRY GetUpdateTime() const
ファイル更新日時の取得
const BOOL APIENTRY IsSystem() const
システムファイルか否か
const FILETIME &APIENTRY GetAccessTime() const
ファイルアクセス日時の取得
const BOOL APIENTRY IsHidden() const
隠しファイルか否か
const FILETIME &APIENTRY GetCreateTime() const
ファイル作成日時の取得
const BOOL APIENTRY IsArchive() const
アーカイブか否か
const BOOL APIENTRY IsCompressed() const
圧縮ファイルか否か
const BOOL APIENTRY IsDirectory() const
ディレクトリか否か
const BOOL APIENTRY IsTemporary() const
中間ファイルか否か
const BOOL APIENTRY IsReadOnly() const
読み取り専用か否か
const LONGLONG APIENTRY GetFileID() const
ファイルIDの取得
const BOOL APIENTRY IsNewName() const
名前を変更されたか(新ファイル名)
const DWORD APIENTRY GetAction() const
ファイル監視結果を取得
const BOOL APIENTRY IsOldName() const
名前を変更されたか(旧ファイル名)
const BOOL APIENTRY IsRemoved() const
削除されたか
const BOOL APIENTRY IsAdded() const
追加されたか
const BOOL APIENTRY IsModified() const
変更されたか
const TString &APIENTRY GetFolderName() const
フォルダ名の取得
const TString &APIENTRY GetFileName() const
ファイル名の取得
const ULONGLONG &APIENTRY GetFileSize() const
ファイルサイズの取得
static skeleton::Array< FileInfo1 > APIENTRY Find(LPCTSTR target, LPCTSTR name, BOOL bRecurse=FALSE)
ファイルの検索
static TString APIENTRY GetTemporaryFileName(LPCTSTR lpctszPath, LPCTSTR lpctszPrefix, UINT nNumber)
テンポラリファイル名を取得します。
static BOOL APIENTRY RemoveDir(LPCTSTR name)
ディレクトリの削除
static TString APIENTRY GetCurrentDir()
カレントディレクトリ名の取得
static VOID APIENTRY Find2(LPCTSTR target, LPCTSTR name, BOOL bRecurse, skeleton::Array< FileInfo1 > &response)
static BOOL APIENTRY Move(LPCTSTR source, LPCTSTR dest)
ファイルの移動
static INT APIENTRY SHFileOperations(ShellOperation operation, LPCTSTR lpctszFrom, LPCTSTR lpctszTo)
static BOOL APIENTRY SetCurrentDir(LPCTSTR name)
カレントディレクトリの移動
static BOOL APIENTRY MakeHardLink(LPCTSTR source, LPCTSTR link)
ハードリンクの作成
static BOOL APIENTRY IsDirectory(LPCTSTR name)
ディレクトリの存在確認
static BOOL APIENTRY MakeDir(LPCTSTR name)
ディレクトリの作成
static TString APIENTRY GetAbsolutePath(LPCTSTR lpctszRelativePath)
カレントディレクトリのパスを連結して絶対パスの作成
static BOOL APIENTRY Copy(LPCTSTR source, LPCTSTR dest, BOOL bFailIfExists=FALSE)
ファイルのコピー
static skeleton::Array< FileInfo2 > APIENTRY DirectoryWatch(LPCTSTR lpctszWatchDirectory, DWORD dwTimeout)
ディレクトリの監視
static BOOL APIENTRY IsExist(LPCTSTR name)
ディレクトリ・ファイルの存在確認
static BOOL APIENTRY Delete(LPCTSTR name)
ファイルの削除
static TString APIENTRY GetTemporaryPath()
テンポラリフォルダを取得します。
BOOL APIENTRY Close()
使用しなくなったハンドルはこれでクローズします。
DWORD APIENTRY Write(LPCVOID lpcvBuffer, DWORD dwSize) const
HANDLEを使ってデータを書き込みます。
文字列に関するWindowsAPIを集約したクラス
TString &APIENTRY Format(LPCTSTR format,...)
フォーマットに従ってパラメータを文字列化します。
LPCTSTR APIENTRY Ctr() const
内部で確保している文字列ポインタを取得します。
スレッドに関するWindowsAPIを集約したクラス
BOOL APIENTRY Create(PTHREAD_START_ROUTINE function=NULL, LPVOID lpvParam=NULL, DWORD dwCreationFlag=0)
スレッドを作成します。
static SYSTEMTIME APIENTRY GetTimeByFileTime(const FILETIME &fileTime)
FILETIME型からSYSTEMTIMEを取得
DWORD APIENTRY Wait(DWORD dwWaitTime=INFINITE) const
シグナル状態になるとブロックを解除します。
VOID APIENTRY Clear()
領域の開放
ShellOperation
SHFILEOPSTRUCT.wFuncに渡す、値の列挙