3

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

4

2 回答 2

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 与 ...),并且可以说会给您更好的错误检查和报告。

于 2011-04-17T03:39:08.790 回答
1

使用boost::filesystem::copy_file复制文件既简单又可移植。不幸的是,您的主要问题归结为获取可执行文件的路径,并且没有可移植的方法来做到这一点

于 2011-04-17T03:49:10.953 回答