在Mac上使用C ++复制文件

时间:2011-04-17 02:45:54

标签: c++ macos file-copying

我用C ++编写了一个Windows程序,它使用了copy terminal命令。我试图将其更改为cp,但它的工作方式与Windows上的复制方式不同。在Windows上,运行shell命令的默认目录是应用程序所在的目录。在Mac上,我显然需要指定一个完整的文件路径。我希望尽可能简化最终用户的流程,因为我想要的文件应该始终与可执行文件位于同一个文件夹中,所以如果我可以简单地复制文件而不要求他们指定位置。

2 个答案:

答案 0 :(得分:2)

您可以使用_NSGetExecutablePath()获取可执行文件的位置。类似的东西:

#include <stdio.h>
#include <mach-o/dyld.h>
#include <libgen.h>

// use some sensible size here
#define BUFSIZE 4096

uint32_t bufsize = BUFSIZE;
char exepath[BUFSIZE];
int result = _NSGetExecutablePath(exepath, &bufsize);
if (result == 0) { // _NSGetExecutablePath() worked
    char command[BUFSIZE];
    char *filename = "somefile.txt";
    char *destination = "/tmp/";
    sprintf(command, "/bin/cp %s/%s %s", dirname(exepath), filename, destination);
    result = system(command);
    if (result == // error checking here
}

通过检查结果值并使用char缓冲区的动态大小,可以使其更加健壮。

为什么不使用C / C ++文件操作函数/类来复制文件而不是使用system()?它们是可移植的(即,您不必担心Windows与Mac OS与Linux相比......)并且可以为您提供更好的错误检查和报告。

答案 1 :(得分:2)

使用boost::filesystem::copy_file复制文件简单易行。不幸的是,你的主要问题归结为获取可执行文件的路径,并且no portable way to do it