Windows 程式設計/檔案管理
本章將討論檔案和目錄管理的一些細節。一些討論的主題包括移動和刪除檔案和目錄、列舉檔案、鎖定檔案、加密檔案以及訪問回收站。
檔案屬性可用於寫入保護、隱藏和取消隱藏檔案,或作為後臺檔案維護。可以使用 **GetFileAttributes** 函式訪問此資訊。這些屬性稱為只讀、隱藏、存檔和系統,下面將對其進行描述
**只讀**:標記為只讀的檔案無法更改。它可以被讀取,但不能被更改或刪除。
**隱藏**:預設情況下,隱藏檔案不會出現在目錄列表中。
**存檔**:存檔屬性可用於選擇性地備份或複製檔案;它在 DOS 中最有用。
**系統**:系統檔案是為作業系統使用而標記的檔案,通常不會顯示在目錄列表中。
要複製檔案或目錄,可以使用兩個函式:**CopyFile** 和擴充套件的 **CopyFileEx**。
BOOL CopyFile(
LPCTSTR lpExistingFileName, // ptr to the name of the file/directory to copy
LPCTSTR lpNewFileName, // ptr to filename to copy to
BOOL bFailIfExists // flag for operation if file exists
);
**lpExistingFileName**:指向包含要複製的檔案/目錄的字串的指標
**lpNewFileName**:指向包含新檔案/目錄路徑的字串的指標
**bFailIfExists**:如果此引數為 TRUE 且新檔案已存在,則函式將失敗;如果為 FALSE,則將覆蓋現有檔案/目錄。
如果函式失敗,則返回值為零,否則為非零。
**CopyFileEx** 稍微複雜一些。您還可以指定在複製檔案的一部分時呼叫的回撥例程。您也可以取消複製操作,如果您想稍後重新啟動它。
BOOL CopyFileEx(
LPCWSTR lpExistingFileName, // pointer to name of an existing file
LPCWSTR lpNewFileName, //pointer to filename to copy to
LPPROGRESS_ROUTINE lpProgressRoutine, // pointer to the callback function
LPVOID lpData, //data to be passed to the callback function
LPBOOL pbCancel, //flag that can be used to cancel the operation
DWORD dwCopyFlags //flags that specify how the file is copied
);
**lpProgressRoutine**:您可以設定一個回撥函式,以便在複製檔案的一部分時呼叫它(它必須採用 PROGRESS_ROUTINE 格式,見下文)。
**lpData**:傳遞給回撥函式的資料(可以為 NULL)。
**pbCancel**:如果在複製操作期間將此標誌設定為 TRUE,則操作將被取消。
**dwCopyFlags**:指定檔案複製的方式。可以是以下值的組合
COPY_FILE_FAIL_IF_EXISTS 如果 lpNewFileName 已存在,則複製操作失敗
COPY_FILE_RESTARTABLE 複製進度在檔案中跟蹤。您可以使用 lpExistingFileName 和 lpNewFileName 的相同值稍後重新啟動複製過程
複製進度例程的定義
DWORD WINAPI CopyProgressRoutine(
LARGE_INTEGER TotalFileSize, // total file size of the file, in bytes
LARGE_INTEGER TotalBytesTransferred, // total number of bytes transferred since operation started
LARGE_INTEGER StreamSize, // size of current stream, in bytes
LARGE_INTEGER StreamBytesTransferred, // total number of bytes transferred for this stream
DWORD dwStreamNumber, // the current stream
DWORD dwCallbackReason, // reason for callback
HANDLE hSourceFile, // handle to the source file
HANDLE hDestinationFile, // handle to the destination file
LPVOID lpData // data passed by CopyFileEx
);
您可以使用前四個引數來顯示一個指示器,顯示程序完成的百分比。
**dwCallbackReason**:可以具有以下值
CALLBACK_CHUNK_FINISHED 複製了資料的另一部分。
CALLBACK_STREAM_SWITCH 建立了一個流,並且它將被複制。這是 Copy Routine Callback 第一次被呼叫時的原因。
此函式必須返回以下值之一
**PROGRESS_CONTINUE** 繼續複製
**PROGRESS_CANCEL** 取消複製操作並刪除目標檔案
**PROGRESS_STOP** 停止操作(它可以稍後重新啟動)
**PROGRESS_QUIET** 繼續複製操作,但不再呼叫 Copy Progress Routine
---
現在,讓我們看看如何移動和重新命名檔案。我們需要使用的函式是 **MoveFile** 和 **MoveFileEx**。這些函式用於移動或重新命名檔案。當您呼叫其中一個函式時,系統只是將檔案複製到新位置(如果您還重新命名了它,則使用不同的名稱)並刪除舊檔案。
BOOL MoveFileEx(
LPCTSTR lpExistingFileName, // address of name of the existing file
LPCTSTR lpNewFileName, // address of new name for the file
DWORD dwFlags // flag to determine how to move file
);
用於刪除檔案的 API 函式是 **DeleteFile** 。要刪除的檔案必須關閉,否則函式將失敗。如果函式失敗,則返回值為 0,如果成功,則為非零。
BOOL DeleteFile(
LPCTSTR lpFileName // pointer to name of file to delete
);
要刪除目錄,可以使用 **RemoveDirectory** 函式,但首先您必須刪除其所有檔案和子目錄(它必須 **為空**)。
BOOL RemoveDirectory(
LPCTSTR lpPathName // address of directory to remove
);
**ReadDirectoryChangesW** 可用於監視目錄(或卷)。它可以在目標目錄中執行某些檔案操作時傳遞通知。
