gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:16:03 26 4
gpt4 key购买 nike

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

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

Attempting to predicate behavior based on the current state of the file system or a particular file on the file system is not recommended. Doing so can cause odd behavior or race conditions. It's far better to attempt an operation (such as loading a file or creating a directory), check for errors, and handle those errors gracefully than it is to try to figure out ahead of time whether the operation will succeed.

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

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

还有其他我应该注意的边境情况吗?

最佳答案

What is the correct way of removing a file (that may or may not exist) in Cocoa?

If I attempt to remove a file that doesn't exist I get an error. Yet, asking if a file exists appears to be discouraged:

Attempting to predicate behavior based on the current state of the file system or a particular file on the file system is not recommended. Doing so can cause odd behavior or race conditions. It's far better to attempt an operation (such as loading a file or creating a directory), check for errors, and handle those errors gracefully than it is to try to figure out ahead of time whether the operation will succeed.

正确的方法就是上面所说的:尝试一下,看看是否会出现错误。

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

I'm currently doing the following:

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

Are there any other border cases I should be aware of?

是的:

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

关于macos - 在 Cocoa 中删除文件的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12600844/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com