Копирование файлов с помощью C ++ на Mac - PullRequest
3 голосов
/ 17 апреля 2011

Я написал программу для Windows на C ++, и она использовала команду копирования терминала. Я попытался изменить его на cp, но он не работал так же, как копирование в Windows. В Windows каталог по умолчанию, из которого запускаются команды оболочки, - это каталог, в котором находится приложение. На Mac мне, очевидно, нужно указать полный путь к файлу. Я хочу максимально упростить процесс для конечных пользователей, и поскольку нужный мне файл должен всегда находиться в той же папке, что и исполняемый файл, было бы лучше, если бы я мог просто продублировать файл, не требуя от них указания местоположение.

Ответы [ 2 ]

2 голосов
/ 17 апреля 2011

Простое и портативное копирование файлов с использованием boost :: filesystem :: copy_file .К сожалению, ваша основная проблема сводится к получению пути к исполняемому файлу, и не существует переносимого способа сделать это .

2 голосов
/ 17 апреля 2011

Вы можете использовать _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 против…) и, ​​возможно, дадут вам лучшую проверку ошибок и отчетность.

...