尝试删除存在的文件时出错

时间:2010-08-17 17:32:31

标签: iphone

测试人员说他只收到一次这个消息,我似乎无法重现它或弄清楚这个消息是如何出现的。在一个坚果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语句说文件存在,但是我尝试删除文件时得到的错误消息说我的文件不存在?

4 个答案:

答案 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)

根据这个答案

  

NSFileManager: removing item

我们需要一个file://前缀。您可以使用[NSURL fileURLWithPath:]来实现它。

快速使用NSURL(fileURLWithPath: realmPath)