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 }