3

C++ で Windows 用のプログラムを作成し、copy ターミナル コマンドを使用しました。cpに変更しようとしましたが、Windowsでのコピーと同じようには機能しませんでした。Windows では、シェル コマンドが実行されるデフォルトのディレクトリは、アプリケーションが配置されているディレクトリです。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 に答える