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

hpi*_*que 3 macos cocoa foundation

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

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

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

我目前正在做以下事情:

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

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

Pet*_*sey 13

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

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

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

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

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

我目前正在做以下事情:

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

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

是:

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