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

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)

【讨论】:

以上是关于尝试删除存在的文件时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 readxl 时出错:“exdir”不存在

Terraform:尝试销毁 EKS 集群时出现“错误:删除 S3 存储桶时出错”

检查数据库文件中是不是存在 ID 时出错

mysql出错的代码解析及解答

尝试将文件路径保存到数据库时出错

hadoop 模式下的 Mrjob:启动作业时出错,输入路径错误:文件不存在