我想通过将文本转储到文件来调试应用程序中的一些内容,如下所示:
FILE *file;
file = fopen("/tmp/file.txt","a+");
fprintf(file,"%s\n", "silly debug message");
fclose(file);
当我将文件作为./myapplication运行时,这是有效的。但是,当我将其捆绑为应用程序包(使用gtk-osx-application和gtk-mac-bundler)并运行应用程序包时,不会创建该文件。它无声地失败并继续执行。
任何想法为什么?是否有沙盒正在进行?
答案 0 :(得分:6)
是的,您的应用包是沙箱,因此您无法写入文件系统中的任意位置(如/tmp
)。要访问特定于您的应用的临时目录,请使用NSTemporaryDirectory;
import <NSPathUtilities.h>
NSString* tempPath = NSTemporaryDirectory();
查看有关文件系统访问here的更多信息。
答案 1 :(得分: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()
等函数来获取您可以在沙盒环境中写入的文件的位置。
答案 2 :(得分:0)
好的,这不再是一个真正的问题。问题是我在根文件夹中有一个额外的MyApp.app /除了我认为我在/ Application中测试的应用程序。使用&#34;打开-a MyApp&#34;时,会使用根文件夹中的旧应用版本。
我生命中的几个小时,我永远不会回来。那好吧。感谢您的反馈,人们。我现在对NSLog(),CFShow(),CFString和syslog()了解得更多,但这仍然非常有用。