2009-11-21 49 views
0

在C/C++中至少有两种复制文件的方法:程序性地使用ShellExecute。如果需要,我可以发布解释,但我会假设这些方法是已知的。使用一种方法比另一种方法有优势吗?程序复制文件与使用ShellExecute和cp之间的权衡是什么?

+0

你最好解释一下为什么你会考虑使用ShellExecute。而“程序性”也是不明确的。你的意思是'打开file1进行阅读,文件2进行写作; while(read(file1,buf)){write(file2,buf); ''?或者只是'SHFileOperation()'? – MSalters 2009-11-23 09:28:52

+0

我的意思是程序上使用C库。 – zooropa 2009-11-23 12:09:37

回答

3

程序上会给你更好的错误检查/报告,并将跨平台工作 - ShellExecute只是Windows API。

您还可以使用第三方文件系统库来减少烦人的任务 - boost :: filesystem是一个不错的选择。

3

手动方法使您可以完全控制如何检测和响应错误。你可以编写不同的访问控制响应,空间不足,来自外星人的敌对文件等等。如果您调用ShellExec(或其他平台上的道德等价物),则会在stderr上留下错误消息。对于带有Window-ed UI的应用程序来说不是太热。

1

为什么像系统内置程序()/的ShellExecute不能使用:

  1. 程序将无法独立于平台
  2. 这些函数每次调用创建一个单独的执行单元

优点:

  1. 代码已经过很好的测试,所以更可靠

在这种情况下,经过良好测试的库是更合乎需要的库。

1

应该避免调用外部应用程序,因为经常(特别是在Windows下)它们不会返回容易理解的错误代码并以不希望的方式报告错误(stdout,error windows,...)。此外,您不能完全控制副本,而仅仅为了执行文件副本而启动新的应用程序往往是过度的,特别是在像Windows这样的平台上,其中进程是相当重量级的对象。

一个很好的折衷可能是使用您的操作系统为您提供的API(例如Windows上的CopyFile),它可以为您提供可靠的工作代码和定义良好的错误代码。但是,如果你想跨平台经常做最简单的事情就是编写你自己的拷贝代码:毕竟它不是火箭科学,它是一个简单的任务,可以在几行标准中完成C++代码。

1

在使用shell的情况下,您正在获得OS供应商实现的功能的最佳可用实现的便利性,其代价是增加了跨进程集成的复杂性。考虑处理错误,文件操作的异步性质,意外丢失返回错误级别,对完成进度的控制有限或不存在,无法响应“中止”/“重试”/“继续”交互式请求等。

相关问题