3

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

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

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

我目前正在执行以下操作:

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

还有其他我应该注意的边境案件吗?

4

2 回答 2

12

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

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

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

正确的方法是那里所说的:尝试一下,看看是否有错误。

有些错误,尤其是 no-such-file,您可以忽略。其他人,您可能想尝试从中恢复——例如,如果错误与权限有关,您可能会尝试请求管理员权限。任何致命的东西,你都应该呈现给用户。

我目前正在执行以下操作:

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

还有其他我应该注意的边境案件吗?

是的:

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

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

于 2012-09-26T11:45:46.287 回答