9

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

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

system( "cp a.txt destination/b.txt" );
  • Windows 使用反斜杠作为路径分隔符。(与 Unix-ish 中的斜杠相比)
  • Windows 对内部复制命令使用“复制”。(与 Unix 中的 cp 相比)

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

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

4

3 回答 3

9

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

取而代之的是fopen() a.txtand dest/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);
于 2011-07-24T15:57:29.500 回答
6

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

特别是 , fopen, fread,fwritefclose就足够了。

确保b在标志中包含 ("binary") 选项fopen

[编辑]

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

或者您可以使用跨平台工具包

于 2011-07-24T15:50:56.713 回答
0

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

于 2011-07-24T15:53:09.667 回答