可可系统()进步?

Jus*_*tin 2 c macos cocoa system

我正在创建一个必须使用该system(const char*)功能来执行"繁重工作" 的应用程序,并且我需要能够为用户提供粗略的进度百分比.例如,如果操作系统正在为您移动文件,它会为您提供一个进度条,其中包含移动的数据量以及窗口上显示的要移动的数据量.我需要这样的东西.如何才能做到这一点?

编辑:基本上,我给用户提供了以压缩格式保存文件的选项.如果他们这样做,它会正常保存然后运行此代码:

char* command = (char*)[[NSString stringWithFormat:@"tar -jcvf %@.tar.bz2 %@", saveurl.path, filename] cStringUsingEncoding:NSUTF8StringEncoding];
system(command);
Run Code Online (Sandbox Code Playgroud)

有时这需要一段时间(应用处理视频文件),所以我希望能够给他们一个估计的完成时间.

Ken*_*ses 5

我正在创建一个应用程序,必须使用该system(const char*) 功能来做一些"繁重的工作"

不,它不必system()像这样使用.事实上,它不应该.有许多其他API用于运行子进程,几乎所有这些都会更好.在Cocoa中,最明显的更好的选择是NSTask.

在任何情况下,除了子进程本身之外,没有什么可以告诉子进程正在进行多少进展.如果你运行的程序没有提供报告进度的方法,那就没什么希望了.没有其他任何东西可以说明子流程的目的或目标是什么,更不用说判断实现目标的程度.

即使程序确实报告了进度,您也需要一种方法来接收该信息. system()不允许这样做. NSTask是,popen()或者手动分叉和执行程序.

  • 你需要说服`tar`报告进展情况.`-v`选项可能允许这样做,尽管你可能必须首先枚举它将手动操作的文件集.然后,您需要以允许您读取其输出的进度指示的方式调用它.为此,你需要的不是`system()`,就像我说的那样.顺便说一下,构建命令的方式对路径中的特殊字符(甚至空格)是不安全的.这是`system()`问题的一部分.它使用shell来解释命令.`NSTask`更容易正确使用. (3认同)