跳轉到內容

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** 可用於監視目錄(或卷)。它可以在目標目錄中執行某些檔案操作時傳遞通知。


Clipboard

要做到
完成


檔案列舉

[編輯 | 編輯原始碼]

鎖定檔案

[編輯 | 編輯原始碼]

加密檔案

[編輯 | 編輯原始碼]

壓縮檔案

[編輯 | 編輯原始碼]

msdn

下一章

[編輯 | 編輯原始碼]
華夏公益教科書