在Cocoa中删除文件的正确方法

时间:2012-09-26 11:37:02

标签: macos cocoa foundation

在Cocoa中删除文件(可能存在或可能不存在)的正确方法是什么?

如果我尝试删除不存在的文件,则会收到错误消息。然而,询问文件是否存在似乎是discouraged

  

尝试根据当前的状态来预测行为   文件系统或文件系统上的特定文件不是   推荐的。这样做可能会导致奇怪的行为或竞争条件。它的   更好地尝试操作(例如加载文件或创建)   一个目录),检查错误,并优雅地处理这些错误   而不是试图提前弄清楚是否操作   会成功的。

我目前正在做以下事情:

[[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];
if (error.code != NSFileNoSuchFileError) {
    NSLog(@"%@", error);
}

我应该注意其他任何边境案件吗?

2 个答案:

答案 0 :(得分:13)

  

在Cocoa中删除文件(可能存在或可能不存在)的正确方法是什么?

     

如果我尝试删除不存在的文件,则会收到错误消息。然而,询问文件是否存在似乎是不鼓励的:

     
    

建议不要尝试基于文件系统的当前状态或文件系统上的特定文件来预测行为。这样做可能会导致奇怪的行为或竞争条件。尝试执行操作(例如加载文件或创建目录),检查错误以及优雅地处理这些错误要比尝试提前判断操作是否成功要好得多。

  

正确的方法就是它所说的:尝试一下,看看你是否收到错误。

有些错误,特别是没有这样的文件,你可以忽略。其他人,您可能想尝试恢复 - 例如,如果错误与权限相关,您可能会尝试要求管理员权限。任何致命的东西,你应该呈现给用户。

  

我目前正在做以下事情:

[[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];
if (error.code != NSFileNoSuchFileError) {
    NSLog(@"%@", error);
}
     

我应该注意其他任何边境案件吗?

是:

    当方法成功时,
  • error不能保证设置为nil(或根本不设置)。您应首先检查方法是否已失败,并且只有在方法确实返回失败时才尝试使用error
  • NSError既有域又有代码。你只是检查其中一个。代码的含义由域决定;例如,4表示Cocoa错误域中的“无此文件”,但POSIX错误域中的“中断系统调用”和OSStatus错误域中的“除以零”。这就是为什么你需要比较两个域和你正在测试的错误的代码。
  • 如果此代码在主线程的任何线程上运行,则使用defaultManager是错误的。创建自己的NSFileManager对象并使用该对象。
  • 登录到控制台足以在开发期间进行调试,但是您应该将其更改为presentError:消息(在主线程上,如果您还没有)在警报框中向用户报告

答案 1 :(得分:1)

认为你已经出现了。我唯一要做的就是使用NSFileManagerDelegate来决定在删除文件之前/之后要做什么(出错时)。