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在应用程序沙箱中写入。您需要遵循App Sandbox Design Guide来确定可以在哪里写入文件,可能使用 Core Foundation 和函数,例如CFCopyHomeDirectoryURL()获取可以在沙盒环境中写入的文件的位置。

于 2013-02-09T10:22:17.017 回答
0

好吧,这不再是一个真正的问题了。问题是,除了我认为我正在 /Application 中测试的应用程序之外,我在根文件夹 / 中还有一个额外的 MyApp.app。使用“open -a MyApp”时,使用的是根文件夹中的旧应用程序版本。

那是我生命中永远不会回来的几个小时。那好吧。感谢您的反馈,人们。我现在对 NSLog()、CFShow()、CFString 和 syslog() 有了更多的了解,尽管如此,这还是非常有帮助的。

于 2013-02-09T19:35:04.697 回答