为什么我们需要编写自己的复制程序,同时我们可以使用copy shell命令?

时间:2015-08-20 01:43:56

标签: c++ file-io stream

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

如我所见,使用" Ctrl + C"和" Ctrl + V"在Windows上,巨大的文件被快速复制。我不确定我们是否能比Windows操作系统做得更好。

哪个是最佳选择?

3 个答案:

答案 0 :(得分:2)

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

顺便说一句,当你看到Windows快速复制文件时 - 它只是透视。文件资源管理器将副本排队或在后台执行此操作。它需要大约相同的时间,例如<{3}}或CopyFileEx,直到复制完成并且文件可用。

答案 1 :(得分:2)

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

Brett Hale&#34;解决方案&#34;方便地不提及所有这些并隐藏在评论后面安全和便携所需的代码&#34;自己做&#34; - 事实上,当你这样做时,你最终会得到比手动复制功能更多的代码,而且它仍然是错误的。如果您有错误,用户可以注入命令(例如,使用目标文件a_file" || rm -rf --no-preserve-root运行它)。你也依赖shell,它本身也有bug(参见Shellshock)

凯文的答案正确地提到了为什么shell完成的复制操作可以更快地工作 - 它可以做更多的技巧让它看起来更快复制。实际上,shell复制操作没有固有的魔力。 &#34;性能问题&#34;因为主要的瓶颈在于实际阅读和写作,所以不是问题。

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

答案 2 :(得分:0)

如果是我,我会避免进行系统调用并执行类似的操作:

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