59 return ::DeleteFile (name);
64 return ::CopyFile (source, dest, bFailIfExists);
69 return ::MoveFile (source, dest);
73 LPCTSTR lpctszPath, LPCTSTR lpctszPrefix, UINT nNumber)
77 ::GetTempFileName (lpctszPath, lpctszPrefix, nNumber, response.
Ptr ());
84 return ::CreateDirectory (name, NULL);
89 return ::RemoveDirectory (name);
94 return ::SetCurrentDirectory (name);
101 BOOL ret = ::GetCurrentDirectory (MAX_PATH, response.
Ptr ());
103 return ret == TRUE ? response : NULL;
110 GetTempPath (MAX_PATH, response.
Ptr ());
119 ::GetFullPathName (lpctszRelativePath, MAX_PATH, response.
Ptr (), NULL);
126 return ::PathIsDirectory (name);
131 return ::PathFileExists (name);
136 WIN32_FIND_DATA myFindData;
141 search.
Format (_T (
"%s\\%s"), target, name);
143 hFind = ::FindFirstFile (search.
Ctr (), &myFindData);
144 if (hFind != INVALID_HANDLE_VALUE)
148 if ((myFindData.cFileName[0] ==
'.' && myFindData.cFileName[1] == NULL) ||
149 (myFindData.cFileName[0] ==
'.' && myFindData.cFileName[1] ==
'.' && myFindData.cFileName[2] == NULL))
159 info.
_FileSize.HighPart = myFindData.nFileSizeHigh;
160 info.
_FileSize.LowPart = myFindData.nFileSizeLow;
161 info.
_Attribute = myFindData.dwFileAttributes;
168 }
while (::FindNextFile (hFind, &myFindData));
177 search.
Format (_T (
"%s\\%s"), target, _T (
"\\*"));
178 hFind = ::FindFirstFile (search.
Ctr (), &myFindData);
179 if (hFind != INVALID_HANDLE_VALUE)
183 if ((myFindData.cFileName[0] ==
'.' && myFindData.cFileName[1] == NULL) ||
184 (myFindData.cFileName[0] ==
'.' && myFindData.cFileName[1] ==
'.' && myFindData.cFileName[2] == NULL))
188 else if (myFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
190 search.
Format (_T (
"%s\\%s"), target, myFindData.cFileName);
198 }
while (::FindNextFile (hFind, &myFindData));
207 WIN32_FIND_DATA myFindData;
211 search.
Format (_T (
"%s\\%s"), target, name);
213 hFind = ::FindFirstFile (search.
Ctr (), &myFindData);
214 if (hFind != INVALID_HANDLE_VALUE)
218 if ((myFindData.cFileName[0] ==
'.' && myFindData.cFileName[1] == NULL) ||
219 (myFindData.cFileName[0] ==
'.' && myFindData.cFileName[1] ==
'.' && myFindData.cFileName[2] == NULL))
229 info.
_FileSize.HighPart = myFindData.nFileSizeHigh;
230 info.
_FileSize.LowPart = myFindData.nFileSizeLow;
231 info.
_Attribute = myFindData.dwFileAttributes;
238 }
while (::FindNextFile (hFind, &myFindData));
247 search.
Format (_T (
"%s\\%s"), target, _T (
"\\*"));
248 hFind = ::FindFirstFile (search.
Ctr (), &myFindData);
249 if (hFind != INVALID_HANDLE_VALUE)
253 if ((myFindData.cFileName[0] ==
'.' && myFindData.cFileName[1] == NULL) ||
254 (myFindData.cFileName[0] ==
'.' && myFindData.cFileName[1] ==
'.' && myFindData.cFileName[2] == NULL))
258 else if (myFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
260 search.
Format (_T (
"%s\\%s"), target, myFindData.cFileName);
261 Find2 (search.
Ctr (), name, bRecurse, response);
264 }
while (::FindNextFile (hFind, &myFindData));
278 DWORD dwNotifyFilter;
279 BOOL bContinue = FALSE;
282 FILE_NOTIFY_CHANGE_FILE_NAME |
283 FILE_NOTIFY_CHANGE_DIR_NAME |
284 FILE_NOTIFY_CHANGE_ATTRIBUTES |
285 FILE_NOTIFY_CHANGE_SIZE |
286 FILE_NOTIFY_CHANGE_LAST_WRITE |
287 FILE_NOTIFY_CHANGE_LAST_ACCESS |
288 FILE_NOTIFY_CHANGE_CREATION;
294 lpctszWatchDirectory,
296 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
299 FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
302 if (hDirectory == INVALID_HANDLE_VALUE)
307 ret = notifyEvent.
Create (NULL, FALSE, FALSE);
319 OVERLAPPED stOverlapped;
320 ZeroMemory (&stOverlapped,
sizeof (stOverlapped));
321 stOverlapped.hEvent = notifyEvent.
GetHandle ();
323 CONST DWORD cdwBufferLength = 4096;
324 WCHAR* buffer =
new WCHAR[cdwBufferLength];
325 ZeroMemory (buffer,
sizeof (WCHAR) * cdwBufferLength);
327 BOOL bWatchSubtree = TRUE;
329 ret = ::ReadDirectoryChangesExW (
332 sizeof (WCHAR) * cdwBufferLength,
338 READ_DIRECTORY_NOTIFY_INFORMATION_CLASS::ReadDirectoryNotifyExtendedInformation);
345 DWORD dwEvent = notifyEvent.
Wait (dwTimeout);
346 if (dwEvent != WAIT_OBJECT_0)
356 PFILE_NOTIFY_EXTENDED_INFORMATION currentPFNI = (PFILE_NOTIFY_EXTENDED_INFORMATION)buffer;
360 if (currentPFNI->Action > 5)
364 response.
Add (errorInfo);
369 if (currentPFNI->Action > 0)
374 CopyMemory (fileName.
Ptr (), currentPFNI->FileName, currentPFNI->FileNameLength);
377 info2.
_FileSize.QuadPart = currentPFNI->FileSize.QuadPart;
379 info2.
_CreateTime.dwLowDateTime = currentPFNI->CreationTime.LowPart;
380 info2.
_CreateTime.dwHighDateTime = currentPFNI->CreationTime.HighPart;
381 info2.
_UpdateTime.dwLowDateTime = currentPFNI->LastModificationTime.LowPart;
382 info2.
_UpdateTime.dwHighDateTime = currentPFNI->LastModificationTime.HighPart;
383 info2.
_AccessTime.dwLowDateTime = currentPFNI->LastAccessTime.LowPart;
384 info2.
_AccessTime.dwHighDateTime = currentPFNI->LastAccessTime.HighPart;
385 info2.
_ChangeTime.dwLowDateTime = currentPFNI->LastChangeTime.LowPart;
386 info2.
_ChangeTime.dwHighDateTime = currentPFNI->LastChangeTime.HighPart;
387 info2.
_Attribute = currentPFNI->FileAttributes;
388 info2.
_FileID = currentPFNI->FileId.QuadPart;
390 response.
Add (info2);
393 currentPFNI += currentPFNI->NextEntryOffset;
394 if (currentPFNI->NextEntryOffset == 0)
break;
395 i += currentPFNI->NextEntryOffset;
401 CloseHandle (hDirectory);
405#if defined (_MSC_VER) && (_MSC_VER >= 1910)
407BOOL FileUtility::MakeSymbolicLink (LPCTSTR source, LPCTSTR link, BOOL isFile)
409 DWORD dwFlags = isFile == TRUE ? 0 : SYMBOLIC_LINK_FLAG_DIRECTORY;
411 dwFlags |= SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE;
413 return ::CreateSymbolicLink (link, source, dwFlags);
420 return ::CreateHardLink (link, source, NULL);
427 SHFILEOPSTRUCT shellOperation{ NULL, NULL, NULL, NULL, NULL };
428 TCHAR tszzFrom[MAX_PATH]{ NULL };
429 TCHAR tszzTo[MAX_PATH]{ NULL };
431 wsprintf (tszzFrom, _T (
"%s\0"), lpctszFrom);
432 wsprintf (tszzTo, _T (
"%s\0"), lpctszTo);
434 shellOperation.hwnd = NULL;
435 shellOperation.wFunc = (WORD)operation;
436 shellOperation.pFrom = tszzFrom;
437 shellOperation.pTo = tszzTo;
438 shellOperation.fFlags = FOF_NO_UI;
440 response = ::SHFileOperation (&shellOperation);
441 ::SHChangeNotify (SHCNE_UPDATEDIR, SHCNF_PATH, (LPCVOID)tszzTo, 0);
イベントに関するWindowsAPIを集約したクラス
ファイルハンドルを伴わないファイルIOに関するWindowsAPIを集約した クラス
イベントに関するWindowsAPIを集約したクラス
BOOL APIENTRY Create(LPCTSTR lpctszName, BOOL bManualReset, BOOL bInitialState)
イベントを作成します。
FileUtility::Find()が返すファイル情報
APIENTRY ~FileInfo1()
デストラクタ
APIENTRY FileInfo1()
コンストラクタ
APIENTRY FileInfo2()
コンストラクタ
APIENTRY ~FileInfo2()
デストラクタ
APIENTRY FileInfo()
コンストラクタ
virtual APIENTRY ~FileInfo()
デストラクタ
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()
テンポラリフォルダを取得します。
HANDLE APIENTRY GetHandle() const
継承先はこの関数でハンドルを取得します。
文字列に関するWindowsAPIを集約したクラス
TString &APIENTRY Format(LPCTSTR format,...)
フォーマットに従ってパラメータを文字列化します。
LPCTSTR APIENTRY Ctr() const
内部で確保している文字列ポインタを取得します。
LPTSTR APIENTRY Ptr() const
内部で確保している文字列ポインタを取得します。
DWORD APIENTRY Wait(DWORD dwWaitTime=INFINITE) const
シグナル状態になるとブロックを解除します。
VOID APIENTRY Add(T &item)
Array<T>へ値を追加
ShellOperation
SHFILEOPSTRUCT.wFuncに渡す、値の列挙