【问题标题】:Using C or C++ to copy a non-text file?使用 C 或 C++ 复制非文本文件?
【发布时间】:2014-01-09 06:08:44
【问题描述】:

如果我用 C 或 C++ 编写程序,在 Windows/CMD 提示符中将非文本文件(.mp3、.avi 等)从一个位置复制到另一个位置,我是否真的依赖 Windows API 来做我的所有工作?复制文本文件是一回事,我可以打开它并逐个字符或逐个字符串地复制。谁能给我一个简短的纲要(如果你有参考链接,那就更好了。我只是问,因为我找不到任何合理的解释。)关于非文本文件复制程序如何工作?

谢谢各位!

【问题讨论】:

  • 您知道文件可以以两种模式之一打开:文本或二进制?
  • 逐个字符或逐个字符串复制字符也是字节复制。所以,复制一个非文本文件,你以二进制模式打开它并逐字节复制。

标签: c++ c file-io copy


【解决方案1】:

CopyFile 对我来说已经足够好了

BOOL WINAPI CopyFile(
  _In_  LPCTSTR lpExistingFileName,
  _In_  LPCTSTR lpNewFileName,
  _In_  BOOL bFailIfExists
);

(来自 msdn)

【讨论】:

    【解决方案2】:
    FILE *inFile, *outFile;
    
    inFile = fopen(inFilePath, "rb");
    outFile = fopen(outFilePath, "wb");
    
    long getFileSize(FILE *file) {
      long curPos, endPos;
      curPos = ftell(file);
      fseek(file, 0, 2);
      endPos = ftell(file);
      fseek(file, curPos, 0);
      return endPos;
    }
    
    size_t bufferLength = getFileSize(inFile);
    uint8_t *buffer = malloc(bufferLength);
    
    void copyFile(FILE *inFile, FILE *outFile) {
      fread(buffer, bufferLength, 1, inFile);
      fwrite(buffer, bufferLength, 1, outFile);
    }
    
    copyFile(inFile, outFile);
    fclose(inFile);
    fclose(outFile);
    

    inFilePathoutFilePath 都必须是指向包含相应文件路径的字符的指针。

    上面的代码是可移植的,以防您正在寻找不特定于平台的东西。我将把错误处理留给你。另外,写的比较匆忙,使用前请仔细阅读。

    【讨论】:

      【解决方案3】:

      归根结底,每个文件都是一个字节序列。您可以逐字节(或更大块)复制任何文件。但是您不应该干扰文件内的数据。以二进制模式打开文件并复制。如果您使用这种方法,您的程序将适用于任何稍作改动的平台。如果您使用的 Windows API 将您的程序仅限于 Windows 平台。

      【讨论】:

      • 不要逐字节复制。分大块做,效率更高
      • @EdHeal 已修复,谢谢。
      猜你喜欢
      • 1970-01-01
      • 2015-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 2014-10-10
      • 1970-01-01
      • 2016-11-07
      相关资源
      最近更新 更多