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

lqe*_*qez 9 c multiplatform

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

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

system( "cp a.txt destination/b.txt" );
Run Code Online (Sandbox Code Playgroud)
  • Windows使用反斜杠作为路径分隔符.(vs Unix中的斜线)
  • Windows使用'copy'作为内部复制命令.(vs unix中的cp)

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

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

Dav*_*ave 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);
Run Code Online (Sandbox Code Playgroud)


Nem*_*emo 6

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

特别是fopen,fread,fwrite,和fclose就足够了.

一定要b在标志中包含("二进制")选项fopen.

[编辑]

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

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

  • 由于目录组织是特定于平台的,因此没有一种完全无关紧要的方法.但是,在API级别,Windows在路径名中接受斜杠或反斜杠(它是需要反斜杠的cmd.exe shell).因此,只要您的Unix名称永远不会包含反斜杠(也可能不是冒号),您就可以了. (2认同)
  • 这是因为经典的Macs没有使用/用于分隔符而是":".如果您阅读http://en.wikipedia.org/wiki/Filename,您会发现很多字符保留,您永远不会猜到! (2认同)