C語言實現檔案複製功能(包括文字檔案和二進位制檔案)

JackyTang發表於2018-05-08

檔案的複製是常用的功能,要求寫一段程式碼,讓使用者輸入要複製的檔案以及新建的檔案,然後對檔案進行復制。能夠複製的檔案包括文字檔案和二進位制檔案,你可以複製1G的電影,也可以複製1Byte的txt文件。

實現檔案複製的主要思路是:開闢一個緩衝區,不斷從原檔案中讀取內容到緩衝區,每讀取完一次就將緩衝區中的內容寫入到新建的檔案,直到把原檔案的內容讀取完。

這裡有兩個關鍵的問題需要解決:
1) 開闢多大的緩衝區合適?緩衝區過小會造成讀寫次數的增加,過大也不能明顯提高效率。目前大部分磁碟的扇區都是4K對齊的,如果讀寫的資料不是4K的整數倍,就會跨扇區讀取,降低效率,所以我們開闢4K的緩衝區。

2) 緩衝區中的資料是沒有結束標誌的,如果緩衝區填充不滿,如何確定寫入的位元組數?最好的辦法就是每次讀取都能返回讀取到的位元組數。

fread() 的原型為:

size_t fread ( void *ptr, size_t size, size_t count, FILE *fp );

它返回成功讀寫的塊數,該值小於等於 count。如果我們讓引數 size 等於1,那麼返回的就是讀取的位元組數。

注意:fopen()一定要以二進位制的形式開啟檔案,不能以文字形式開啟,否則系統會對檔案進行一些處理,如果是文字檔案,像.txt等,可能沒有問題,但如果是其他格式的檔案,像.mp4, .rmvb, .jpg等,複製後就會出錯,無法讀取。

程式碼實現:


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int copyFile(char *fileReadchar *fileWrite);
  4. int main(){
  5. char fileRead[100];  // 要複製的檔名
  6. char fileWrite[100];  // 複製後的檔名
  7. // 獲取使用者輸入
  8. printf(“要複製的檔案:”);
  9. scanf(“%s”, fileRead);
  10. printf(“將檔案複製到:”);
  11. scanf(“%s”, fileWrite);
  12. // 進行復制操作
  13. ifcopyFile(fileRead, fileWrite){
  14. printf(“恭喜你,檔案複製成功!
    );
  15. }else{
  16. printf(“檔案複製失敗!
    );
  17. }
  18. return 0;
  19. }
  20. /**
  21. * 檔案複製函式
  22. @param fileRead 要複製的檔案
  23. @param fileWrite 複製後檔案的儲存路徑
  24. @return int 1: 複製成功;2: 複製失敗
  25. **/
  26. int copyFile(char *fileReadchar *fileWrite){
  27. FILE *fpRead// 指向要複製的檔案
  28. FILE *fpWrite// 指向複製後的檔案
  29. int bufferLen 1024*4// 緩衝區長度
  30. char *buffer (char*)malloc(bufferLen);  // 開闢快取
  31. int readCount// 實際讀取的位元組數
  32. if(fpRead=fopen(fileRead“rb”)) == NULL || (fpWrite=fopen(fileWrite“wb”)) == NULL ){
  33. printf(“Cannot open file, press any key to exit!
    );
  34. getch();
  35. exit(1);
  36. }
  37. // 不斷從fileRead讀取內容,放在緩衝區,再將緩衝區的內容寫入fileWrite
  38. while(readCount=fread(buffer1, bufferLen, fpRead)) ){
  39. fwrite(buffer, readCount1, fpWrite);
  40. }
  41. free(buffer);
  42. fclose(fpRead);
  43. fclose(fpWrite);
  44. return 1;
  45. }

執行結果:

要複製的檔案:d://1.mp4
將檔案複製到:d://2.mp4
恭喜你,檔案複製成功!

如果檔案不存在,會給出提示,並終止程式:

要複製的檔案:d://123.mp4
將檔案複製到:d://333.mp4
d://cyuyan.txt: No such file or directory

第46行是檔案複製的核心程式碼。通過fread()函式,每次從 fileRead 檔案中讀取 bufferLen 個位元組,放到緩衝區,再通過fwrite()函式將緩衝區的內容寫入fileWrite檔案。

正常情況下,每次會讀取bufferLen個位元組,即readCount=bufferLen;如果檔案大小不足bufferLen個位元組,或者讀取到檔案末尾,實際讀取到的位元組就會小於bufferLen,即readCount<bufferLen。所以通過fwrite()寫入檔案時,應該以readCount為準。

相關文章