[WinAPI] API 9 [文件的刪除、復制和移動功能]


 

 

Windows系統為文件的刪除、復制、重命名或移動文件提供了相應的API函數。刪除文件使用DeleteFile函數;復制文件使用CopyFile函數;重命名文件和移動文件實際是一個操作,使用MoveFile函數。這幾個函數的使用都非常簡單,下面分別介紹。


(1) DeleteFile。
DeleteFile的功能是刪除文件。以文件路徑作為輸入,指向需要刪除的文件。文件路徑可以是類似於“c:\files\delete.txt”的絕對路徑,也可以是類似於“.\delete.txt”的相對路徑,二相對於可執行文件所在的路徑。
◇參數
lpFileName:輸入參數,所要刪除的文件的相對路徑或絕對路徑。
◇返回值
返回BOOL值,表示文件刪除是否成功。
◇使用說明
如果程序返回失敗,可以使用GetLastError函數獲取錯誤信息。

 

(2) CopyFile。
CopyFile的功能是復制文件。通過參數輸入復制文件和源路徑和目的路徑,路徑可以是絕對路徑也可以是相對路徑,還可以通過參數指明如果目的路徑已經存在文件,是否覆蓋。可以使用CopyFileEx函數進行更為高級的操作,比如在復制進行過程中取消復制等。CopyFileEx可以指定
一個回調函數來處理文件復制中所可能發生的各種情況。
◇參數
lpExistingFileName:輸入參數,已經存在的所需復制文件的源路徑。
lpNewFileName:輸入參數,新文件路徑,復制文件的目的路徑。
bFailIfExists:輸入參數,指明如果在目的路徑存在文件時是否覆

將不覆蓋已經存在的文件,如果存在,則返回失敗。這時使用GetLastError獲取錯誤代碼,將返回80(Ox50)。
◇返回值
返回BOOL值,表示文件復制是否成功。
◇使用說明
如果程序返回失敗,可以使用GetLastError函數獲取錯誤信息。


(3) MoveFile。
MoveFile的功能是移動、重命名文件和目錄。通過參數輸入源路徑和目的路徑,路徑可以是絕對路徑也可以是相對路徑,如果目的路徑的文件或目錄已經存在,則返回失敗。可以使用MoveFileEx函數來指定更多的選項,如果已經存在是否替換等。還可以使用MoveFileWithProgress指定一個回調函數來處理文件移動中所可能發生的各種情況。

◇參數
lpExistingFileName:輸入參數,為已經存在的所需移動文件的源路徑。
lpNewFileName:輸入參數,新文件路徑,移動文件的目的路徑。
◇返回值
返回BOOL值,表示文件移動是否成功。
◇使用說明
如果程序返回失敗,可以使用GetLastError函數獲取錯誤信息。


(4) CopyFileEx、MoveFileEx以及MoveFileWithProgreSS.
這3個API函數功能更豐富,不再做詳細介紹.

 

本實例使用DeleteFile、CopyFile、MoveFile來完成文件的刪除、復制和移動功能。編譯生成可執行文件,通過參數來指定程序完成的功能。-d參數表示刪除文件,后面跟所需刪除的文件路徑;-m參數表示移動、重命名文件,之后的參數分別是源路徑和目的路徑;-c參數表示復制文件,之后跟源路徑和目的路徑。在復制文件過程中,如果文件已經存在,會提醒用戶是否覆蓋。

 

 

  1 /* ************************************
  2 *《精通Windows API》 
  3 * 示例代碼
  4 * wr.c
  5 * 4.3.2    創建、打開、讀寫文件,獲取文件大小
  6 **************************************/
  7 
  8 /* 頭文件 */
  9 #include <windows.h>
 10 #include <stdio.h>
 11 
 12 /* ************************************
 13 * DWORD ReadFileContent(LPSTR szFilePath)
 14 * 功能    獲取文件大小
 15 *        讀取文件內容,並以16進制的形式打印出來
 16 * 參數    LPSTR szFilePath
 17 *        文件路徑
 18 **************************************/
 19 DWORD ReadFileContent(LPSTR szFilePath)
 20 {
 21     //文件大小
 22     HANDLE hFileRead;
 23     //保存文件大小
 24     LARGE_INTEGER liFileSize;
 25     //成功讀取的文件數據大小
 26     DWORD dwReadedSize;
 27     //累加計算已經讀取數據的大小
 28     LONGLONG liTotalRead = 0;
 29     //文件數據緩存
 30     BYTE lpFileDataBuffer[32];
 31 
 32     //打開已經存在的文件,讀取內容。    
 33     hFileRead = CreateFileA(szFilePath,// 要打開的文件名
 34         GENERIC_READ,               // 以讀方式打開
 35         FILE_SHARE_READ,           // 可共享讀
 36         NULL,                      // 默認安全設置
 37         OPEN_EXISTING,             // 只打開已經存在的文件
 38         FILE_ATTRIBUTE_NORMAL,     // 常規文件屬性
 39         NULL);                     // 無模板
 40 
 41     //打開文件是否成功。
 42     if(hFileRead==INVALID_HANDLE_VALUE)
 43     {
 44         printf("打開文件失敗:%d",GetLastError());
 45     }
 46 
 47     if(!GetFileSizeEx(hFileRead,&liFileSize))
 48     {
 49         printf("獲取文件大小失敗:%d",GetLastError());
 50     }
 51     else
 52     {
 53         printf("文件大小為:%d/n",liFileSize.QuadPart);
 54     }
 55 
 56     //循環讀取並打印文件內容
 57     while(TRUE)
 58     {
 59         DWORD i;
 60 
 61         if(!ReadFile(hFileRead,    //讀文件的句柄
 62             lpFileDataBuffer,    //存儲讀取的文件內容
 63             32,                    //讀的大小(字節)
 64             &dwReadedSize,        //實際讀取的大小
 65             NULL))                //不使用Overlapped
 66         {
 67             printf("讀文件錯誤:%d/n",GetLastError());
 68             break;
 69         }
 70         printf("讀取了%d字節,文件內容是:",dwReadedSize);
 71         
 72         for(i=0; i<dwReadedSize; i++)
 73         {
 74             printf("0x%x ",lpFileDataBuffer[i]);
 75         }
 76         printf("/n");
 77         liTotalRead += dwReadedSize;
 78         if(liTotalRead == liFileSize.QuadPart)
 79         {
 80             printf("讀文件結束/n");
 81             break;
 82         }
 83     }
 84     CloseHandle(hFileRead);
 85     return 0;
 86 }
 87 
 88 /* ************************************
 89 *  SaveDataToFile
 90 * 功能    將數據存儲到文件末尾
 91 * 參數    LPSTR szFilePath    文件路徑
 92 *        LPVOID lpData        需存儲的數據
 93 *        DWORD dwDataSize    數據大小(字節)
 94 **************************************/
 95 DWORD SaveDataToFile(
 96                      LPSTR szFilePath,
 97                      LPVOID lpData,
 98                      DWORD dwDataSize)
 99 {
100     //文件句柄
101     HANDLE hFileWrite;
102     //成功寫入的數據大小
103     DWORD dwWritedDateSize;
104 
105     //打開已經存在的文件,讀取內容。    
106     hFileWrite = CreateFileA(szFilePath,    // 要打開的文件名
107         GENERIC_WRITE,            // 以寫方式打開
108         0,                        // 可共享讀
109         NULL,                    // 默認安全設置
110         OPEN_ALWAYS,            // 打開已經存在的文件,沒用則創建
111         FILE_ATTRIBUTE_NORMAL,    // 常規文件屬性
112         NULL);                    // 無模板
113     
114     //判斷是否打開成功
115     if(hFileWrite==INVALID_HANDLE_VALUE)
116     {
117         printf("打開文件失敗:%d/n",GetLastError());
118     }
119 
120     //設置文件指針到文件尾
121     SetFilePointer(hFileWrite,0,0,FILE_END);
122 
123     //將數據寫入文件
124     if(!WriteFile(hFileWrite,lpData,dwDataSize,&dwWritedDateSize,NULL))
125     {
126         printf("寫文件失敗:%d/n",GetLastError());
127     }
128     else
129     {
130         printf("寫文件成功,寫入%d字節。/n",dwWritedDateSize);
131     }
132     CloseHandle(hFileWrite);
133     return 0;
134 }
135 
136 /* ************************************
137 * int main(void)
138 * 功能    演示使用SaveDataToFile和ReadFileContent函數
139 **************************************/
140 int main(void)
141 {
142     LPSTR szFileData = "這是一個例子";
143     SaveDataToFile("C://show.txt",szFileData,lstrlenA(szFileData));
144     ReadFileContent("C://show.txt");
145     return 0;
146 }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM