4

次のように、テキストをファイルにダンプして、アプリケーションの一部をデバッグしたいと思います。

FILE *file; 
file = fopen("/tmp/file.txt","a+");
fprintf(file,"%s\n", "silly debug message"); 
fclose(file);

これは、ファイルを./myapplicationとして実行すると機能します。しかし、それをアプリバンドルとして(gtk-osx-applicationgtk-mac-bundlerを使用して)バンドルしてアプリバンドルを実行すると、ファイルが作成されません。サイレントに失敗し、実行を継続します。

なぜ何かアイデアはありますか?サンドボックス化は行われていますか?

4

3 に答える 3

6

はい、アプリ バンドルはサンドボックス化されているため、ファイル システム内の任意の場所 ( など) に書き込むことはできません/tmp。アプリ固有の一時ディレクトリにアクセスするには、代わりにNSTemporaryDirectoryを使用します。

import <NSPathUtilities.h>

NSString* tempPath = NSTemporaryDirectory();

ファイル システム アクセスの詳細については、こちらを参照してください

于 2013-02-09T10:18:08.443 に答える
1

サンドボックスを使用してテスト アプリを作成し、追加のエラー チェックを追加すると、次のようになります。

FILE *file = fopen("/tmp/file.txt","a+");
if (file != NULL)
{
    fprintf(file,"%s\n", "silly debug message");
    fclose(file);
}
else
{
    NSLog(@"Failed to create file: %d", errno);
}

私は得る:

2013-02-09 10:19:43.680 WriteTest[11988:303] Failed to create file: 1

コマンドラインから:

$ perror 1 
1       : Operation not permitted

/tmpそのため、アプリ サンドボックスへの書き込みは許可されていません。ファイルを書き込むことができる場所を決定するには、アプリ サンドボックス デザイン ガイドに従う必要があります。たとえば、コア ファンデーションやCFCopyHomeDirectoryURL()、サンドボックス環境内で書き込むことができるファイルの場所を取得する関数などを使用します。

于 2013-02-09T10:22:17.017 に答える
0

OK、これはもう本当の質問ではありません。問題は、/Application でテストしていると思っていたアプリに加えて、ルート フォルダーに余分な MyApp.app があったことです。「open -a MyApp」を使用すると、ルート フォルダーにある古いアプリ バージョンが使用されました。

それは私が二度と戻らない私の人生の数時間です。しかたがない。フィードバックありがとうございます。NSLog()、CFShow()、CFString、および syslog() について詳しく知っていますが、それでも非常に役に立ちます。

于 2013-02-09T19:35:04.697 に答える