我正在为每次执行应用程序编写一个简单的日志文件。日志文件名基于当前时间并存储在app目录中。下面的代码是我尝试在模拟器上运行的代码,但是当我在iPad上执行时它失败并且“不允许操作”(errno.h中的EPERM)。
-(BOOL)CreateLogFile
{
mLogFilePath = [self GetLogFileNameForTimeNow];
BOOL Success = [[NSFileManager defaultManager] createFileAtPath:mLogFilePath contents:nil attributes:nil];
/*BOOL Success = [[NSFileManager defaultManager] createFileAtPath:mLogFilePath contents:nil attributes:[NSDictionary dictionaryWithObject:NSFileProtectionComplete
forKey:NSFileProtectionKey]];*/
if ( Success )
{
NSLog( @"Successfully created file: %@", mLogFilePath );
mLogFileHandle = [NSFileHandle fileHandleForWritingAtPath:mLogFilePath];
[self WriteInstanceInformationToLog];
}
else
{
NSLog( @"Failed to create file: %@ %s", mLogFilePath, strerror(errno) );
}
return Success;
}
我也尝试了注释掉的代码,但也失败了。我是iOS编程的新手,所以可能会遗漏一些基本的东西。无论如何,上面的输出形式在iPad上显示如下:
2013-05-10 14:54:51.794 RichTest1[128:907] Failed to create file:
/var/mobile/Applications/XXXX/RichTest1.app/20130510145451.log Operation not permitted
但在模拟器上它可以工作:
2013-05-10 15:07:14.696 RichTest1[1604:c07] Successfully created file:
Users/abruce/Library/Application Support/iPhone Simulator/6.1/Applications/XXXX/RichTest1.app/20130510150714.log
我哪里错了?
- 编辑
以下是GetLogFileNameForTimeNow
-(NSString*)GetLogFileNameForTimeNow
{
NSString* FileName = [NSString stringWithFormat:@"%@.log", [self GetTimeAsString] ];
NSString* AppFolderPath = [[NSBundle mainBundle] resourcePath];
return [NSString stringWithFormat:@"%@/%@", AppFolderPath, FileName];
}
-(NSString*)GetTimeAsString
{
return [mDateFormatter stringFromDate:[NSDate date]];
}
和日期格式化程序在我的类的构造函数中设置如下:
mDateFormatter = [[NSDateFormatter alloc] init];
NSString* DateFormat = @"yyyyMMddHHmmss";
[mDateFormatter setDateFormat:DateFormat];
答案 0 :(得分:12)
您正在尝试在应用包内创建一个文件,该文件在设备上是只读的。将您的文件放入应用程序的Documents或Library目录中。
答案 1 :(得分:8)
您正尝试在无权创建文件的位置创建文件
在文档文件夹
中创建文件NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"20130510150714.log"];
BOOL Success = [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
答案 2 :(得分:1)
我通过更改GetLogFileNameForTimeNow函数修复了问题,如下所示:
-(NSString*)GetLogFileNameForTimeNow
{
NSString* FileName = [NSString stringWithFormat:@"%@.log", [self GetTimeAsString] ];
NSArray* Paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* DocumentsDirectory = [Paths objectAtIndex:0]; // Get documents folder
return [NSString stringWithFormat:@"%@/%@", DocumentsDirectory, FileName];
}