测试人员说他只收到一次这个消息,我似乎无法重现它或弄清楚这个消息是如何出现的。在一个坚果shell中,我的应用程序启动一个后台线程并从我们的服务器获取数据。一旦我们完成下载数据,我们将它存储在一个xml文件中,这样我们就可以从这个文件中获取数据,因为我们在解析xml时关闭了。解析xml后,我删除了文件。这是我的删除代码。
-(void)deleteSavedXmlServerData
{
AppDelegate_Shared* appDelegate = (AppDelegate_Shared*)[[UIApplication sharedApplication] delegate];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *fileToLoad = [NSString stringWithFormat:@"%@/%@/upload.xml", [paths objectAtIndex:0], appDelegate.userId];
if([[NSFileManager defaultManager] fileExistsAtPath:fileToLoad] == YES)
{
NSError *error = nil;
[[NSFileManager defaultManager] removeItemAtPath:fileToLoad error:&error];
if(error != nil)
{
eNSLog(@"%s Error Parsing old data: %@ info: %@", __PRETTY_FUNCTION__, error, [error userInfo]);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Problem With Syncing"
message:@"Problem reading in old data."
delegate:nil
cancelButtonTitle:@"ok"
otherButtonTitles:nil];
[alert show];
[alert release];
}
}
}
一切似乎都很完美,如果这个文件没有被删除,这并不是什么大问题。但我很困惑为什么我会在删除这个文件时遇到问题。
当我检查错误信息是什么时,这就是我得到的。
-[ServerSync deleteSavedXmlServerData] Error Parsing old data: Error Domain=NSCocoaErrorDomain Code=4 UserInfo=0x11f3ed60 "Operation could not be completed. (Cocoa error 4.)" info: {
NSFilePath = "/var/mobile/Applications/CD181518-512F-4A0E-82ED-C438886E4A1D/Documents/71BD9A11-A604-6001-549C-DF6582F60124/upload.xml";
NSUserStringVariant = Remove;
}
如果有人知道为什么我的文件存在并且我创建了它,为什么我不能删除它?
更新
让我最困惑的问题是,为什么第一个if语句说文件存在,但是我尝试删除文件时得到的错误消息说我的文件不存在?
答案 0 :(得分:2)
阅读NSFileManager的文档(不知道我是否第一次错过了它),它说不使用单例方法[NSFileManager defaultManager]
,因为NSFileManager不是线程安全的。从那时起我就没有遇到过这个问题。
答案 1 :(得分:1)
看起来文档目录路径是/.../71BD9A11-A604-6001-549C-DF6582F60124CD181518-512F-4A0E-82ED-C438886E4A1D/Documents/71BD9A11-A604-6001-549C-DF6582F60124。它应该以/ Documents。结尾。
使用Google搜索NSCocoaErrorDomain提供NSFileNoSuchFileError = 4
。
答案 2 :(得分:0)
在删除文件之前测试文件是否存在竞争条件,因为另一个线程可以进入并在执行删除代码之前将其删除。最好重构代码以首先删除文件,并忽略与找不到文件相关的任何“错误”。
BTW:关于[NSFileManager defaultManager]不是线程安全的答案并不完全正确。它是线程安全的,除非使用委托进行通知。
答案 3 :(得分:0)
根据这个答案
我们需要一个file://前缀。您可以使用[NSURL fileURLWithPath:]
来实现它。
快速使用NSURL(fileURLWithPath: realmPath)