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

 

 

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


(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函數獲取錯誤信息。app


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

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


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

 

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

 

 

  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 }
相關文章
相關標籤/搜索