【问题标题】:How can I copy files in C without platform dependency?如何在没有平台依赖性的情况下在 C 中复制文件?
【发布时间】:2011-07-24 15:47:50
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 问题不在于我上面提到的“复制”。

标签: c multiplatform


【解决方案1】:

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);

【讨论】:

  • 感谢您的回答。但它并不能解决路径分隔符问题。
  • 根据:msdn.microsoft.com/en-us/library/77859s1t(v=VS.71).aspx 路径分隔符是system() 的问题,而不是fopen() 的问题。由于 shell 调用,它在系统中失败。
  • @Dave:这些不应该是fclose() 电话吗?
【解决方案2】:

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

特别是,fopenfreadfwritefclose 就足够了。

确保在fopen 的标志中包含b(“二进制”)选项。

[编辑]

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

或者您可以使用cross-platform toolkit

【讨论】:

  • 感谢您的回答。但是跨平台工具包对于我的小项目来说太大了。没有解决斜线问题的简单解决方案吗?
  • 由于目录组织是特定于平台的,因此没有一种完全简单的方法。但是,在 API 级别,Windows 接受路径名中的斜杠或反斜杠(它是 cmd.exe shell 需要反斜杠)。因此,只要您的 Unix 名称不包含反斜杠(可能也不包含冒号),您就可以了。
  • @Jonathan:好吧,我承认我不知道。在 Windows 上合法的带有斜杠的文件名怎么样?也许我应该找个时间试试看:-)
  • 那是因为经典 Mac 没有使用 / 作为分隔符,而是使用 ":"。如果您阅读 en.wikipedia.org/wiki/Filename ,您会发现很多您永远猜不到的保留字符!
  • @lqez: fopen 等不仅仅是 POSIX;它们是 C 标准本身的一部分。所以它们非常便携。 (虽然我不相信 C 标准提供了任何创建目录的方法。)
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2019-01-31
    • 1970-01-01
    • 2011-09-02
    相关资源
    最近更新 更多