尝试删除存在的文件时出错
Posted
技术标签:
【中文标题】尝试删除存在的文件时出错【英文标题】:Error when trying to deleting a file that exist 【发布时间】:2010-08-17 17:32:30 【问题描述】:一位测试人员说他只收到过一次这条消息,我似乎无法重现它或弄清楚这条消息是如何出现的。简而言之,我的应用程序启动了一个后台线程并从我们的服务器获取数据。一旦我们完成了数据的下载,我们将它存储在一个 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 语句说文件存在,但我尝试删除文件时得到的错误消息却说我的文件不存在?
【问题讨论】:
【参考方案1】:阅读 NSFileManager 的文档(不知道我是不是第一次错过了),它说不要使用单例方法[NSFileManager defaultManager]
,因为 NSFileManager 不是线程安全的。从那以后我就没有这个问题了。
【讨论】:
【参考方案2】:文档目录路径看起来是/.../71BD9A11-A604-6001-549C-DF6582F60124CD181518-512F-4A0E-82ED-C438886E4A1D/Documents/71BD9A11-A604-6001-549C-DF6582F60124。它应该以 /Documents 结尾。
在谷歌上搜索 NSCocoaErrorDomain 会得到NSFileNoSuchFileError = 4
。
【讨论】:
Opps,我发布了错误的 fileToLoad。我将帖子编辑为正确的。至于 NSCocoaErrorDomain 代码,那是我困惑的部分。我的第一个 if 语句检查文件是否存在,它确实存在。为什么remove语句说不存在? 您正在使用线程。是否有可能有其他线程访问它? 这是可能的,但是这个文件只是在同一个线程上创建和删除的。它不应该被不同的线程访问,除非 fileManger 在主线程上做所有事情。我会再检查一次。【参考方案3】:在删除之前测试文件是否存在会遇到竞争条件,因为另一个线程可以在删除代码执行之前进入并删除它。最好重构您的代码以首先删除文件并忽略与找不到文件相关的任何“错误”。
顺便说一句:关于 [NSFileManager defaultManager] 不是线程安全的答案并不完全正确。它是线程安全的,除非使用委托进行通知。
【讨论】:
【参考方案4】:根据这个答案
NSFileManager: removing item
我们需要有一个 file:// 前缀。您可以使用[NSURL fileURLWithPath:]
来实现它。
为了快速使用NSURL(fileURLWithPath: realmPath)
【讨论】:
以上是关于尝试删除存在的文件时出错的主要内容,如果未能解决你的问题,请参考以下文章