【问题标题】:Copying Files Using C++ on a Mac在 Mac 上使用 C++ 复制文件
【发布时间】:2011-08-07 03:50:03
【问题描述】:

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

【问题讨论】:

  • 您的程序是应用程序包吗?
  • 没有。只是在 xCode 中编译的单个文件。

标签: c++ macos file-copying


【解决方案1】:

您可以使用_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 与......),并且可以说可以为您提供更好的错误检查和报告。

【讨论】:

  • 这是我为 Windows 制作的一款有趣的应用程序,它变得异常流行,所以我一开始没想到需要移植它。
  • @Person 我看到了。好吧,因为_NSGetExecutablePath(),你需要有一个特定于 Mac OS 的版本。如果您想为 Windows 和 Mac OS X 使用相同的源文件,__APPLE__ 预处理器宏很有用。
【解决方案2】:

使用boost::filesystem::copy_file 复制文件既简单又便携。不幸的是,您的主要问题归结为获取可执行文件的路径,还有no portable way to do it

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2014-08-29
    • 1970-01-01
    相关资源
    最近更新 更多