如何在没有平台依赖性的情况下复制C中的文件?

时间:2011-07-24 15:47:50

标签: c multiplatform

看起来这个问题非常简单,但我无法找到在没有平台依赖的情况下在C中复制文件的明确解决方案。

我在我的开源项目中使用了一个system()调用来创建目录,复制文件和运行外部程序。它在Mac OS X和其他Unix-ish系统中运行良好,但在Windows上失败。问题是:

system( "cp a.txt destination/b.txt" );
  • Windows使用反斜杠作为路径分隔符。 (vs Unix中的斜线)
  • Windows使用'copy'作为内部复制命令。 (vs-ch in Unix-ish)

如何编写没有依赖的复制代码?

(实际上,我写了一些宏来解决这个问题,但这并不酷。http://code.google.com/p/npk/source/browse/trunk/npk/cli/tests/testutil.h,L22-56)

3 个答案:

答案 0 :(得分:9)

system()功能比它的价值更麻烦;它在一个单独的过程中调用shell,通常应该避免。

取而代之的是fopen() a.txtdest/b.text,并使用getc() / putc()进行复制(因为标准库更有可能做页面 - 对齐缓冲比你)

FILE *src = fopen("a.txt", "rb");
FILE *dst = fopen("dest/b.txt", "wb");
int i;
for (i = getc(src); i != EOF; i = getc(src))
{
    putc(i, dst);
}
fclose(dst);
fclose(src);

答案 1 :(得分:6)

您需要使用stdio.h中的C标准库函数。

特别是fopenfreadfwritefclose就足够了。

请务必在b的标记中加入fopen(“二进制”)选项。

[编辑]

不幸的是,文件名本身(正斜杠与反斜杠)仍然依赖于平台。所以你需要某种#ifdef或类似的来处理它。

或者您可以使用cross-platform toolkit

答案 2 :(得分:0)

使用标准C库stdio.h。首先打开输入文件,使用fopen(inputFilename, "rb")进行阅读,打开输出文件,使用fopen(outputFilename, "wb")进行书写,使用freadfwrire复制内容。然后使用fclose关闭这两个文件。