【发布时间】:2013-01-29 00:58:39
【问题描述】:
我有一个在 iOS (iPad) 上运行的简单程序,它打开一个文件,写入一些数据,关闭文件,然后尝试重新打开文件。奇怪的是,第二次打开有时会失败,返回码 -1 和 errno 13(权限被拒绝)。如果我多次运行代码,它将交替失败和成功(模式似乎是随机的)。
下面是我正在使用的代码,谁能解释我做错了什么?第一次打开总是成功,写入也总是成功。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"file.txt"];
result = remove([appFile cStringUsingEncoding:NSASCIIStringEncoding]);
int fp = open([appFile cStringUsingEncoding:NSASCIIStringEncoding], O_RDWR | O_CREAT);
result = write(fp, "abc", 3);
close(fp);
fp = open([appFile cStringUsingEncoding:NSASCIIStringEncoding], O_RDONLY);
NSLog(@"fp = %i, errno = %i", fp, errno);
close(fp);
【问题讨论】:
-
第一次打开
O_RDWR | O_CREAT真的每次都有效吗?你能把它改成if ((fp = open(..)) != -1) { } else { NSLog (errno) }吗?你也可以输出完整的文件名吗? -
是的,我验证了第一个打开的工作始终如一。完整文件名是:/var/mobile/Applications/AF7710BE-48C4-45F9-B749-E010AED330DE/Documents/file.txt
-
从手册页打开:
The oflag argument may indicate that the file is to be created if it does not exist (by specifying the O_CREAT flag). In this case, open requires a third argument mode_t mode;。由于您没有指定第三个参数,它将使用随机值,这就是它有时会失败的原因。添加第三个参数0644,就可以一直工作了。 -
谢谢,成功了!如果您愿意,请随时做出完整的回答,我会接受。
标签: ios file error-handling