为什么我们可以使用copyshell命令却要自己写一个copy程序呢?

Why do we need to write an own copy program while we can use copy shell command?

我想在我的 C/C++ 程序中复制大文件(~ 10 GB),手头有两个选项:1) 编写我自己的复制函数(可能会使用大缓冲区),以及 2 ) 调用系统复制命令(复制 Windows,cp Linux)。

据我所知,当在 Windows 上使用 "Ctrl + C" 和 "Ctrl + V" 时,大文件的复制速度非常快。我不确定我们是否可以比 Windows OS.

做得更好

哪个是最佳选择?

如果是我,我会避免进行系统调用并做这样的事情:

    int main()
    {
         std::ifstream  src("from.ogv", std::ios::binary);
         std::ofstream  dst("to.ogv",   std::ios::binary);
         dst << src.rdbuf();
    }

通过适当的实施,滚动您自己的代码™ 使您可以灵活地完成 shell 副本。例如,更容易中止操作,并向用户提供进度。

顺便说一下,当您看到 Windows 正在快速复制文件时 - 这只是观点。文件资源管理器将副本排队或以其他方式在后台执行。它需要大约相同的时间,例如CopyFileEx or sendfile 直到复制完成并且文件可用。

不使用 shell 来使用语言中的基本任务的原因与性能完全无关——更多的是关于安全性和可移植性。您不会在您的语言中使用 eval,也不会尝试连接字符串来创建 SQL 查询 - 然而您却在那里,通过连接字符串创建 shell 命令。

Brett Hale 的 "solution" 很方便地没有提及所有这些,并将使它安全和可移植所需的代码隐藏在注释后面 "do it yourself" - 事实上,当您这样做时,您将结束编写比手动复制功能更多的代码,它仍然会有错误。如果那里有错误,用户可以注入命令(例如,运行 它带有目标文件 a_file" || rm -rf --no-preserve-root)。此外,您还依赖于 shell,它本身可能存在错误(请参阅 Shellshock)

Calvin 的回答正确地提到了为什么 shell 完成的复制操作可能工作得更快——它可以做更多的技巧来使它看起来像复制更快。事实上,shell 复制操作并没有内在的魔力。 "performance problem"不是问题,主要瓶颈在实际读写上。

此外,您提出了错误的二分法,因为您没有考虑使用第三方选项:第三方库。其中之一是Boost.Filesystem,它具有复制功能。