簡體   English   中英

在Cocoa中刪除文件的正確方法

[英]Correct way of removing a file in Cocoa

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

如果我嘗試刪除不存在的文件,我會收到錯誤。 然而,詢問文件是否存在似乎是不鼓勵的

建議不要嘗試基於文件系統的當前狀態或文件系統上的特定文件來預測行為。 這樣做可能會導致奇怪的行為或競爭條件。 嘗試執行操作(例如加載文件或創建目錄),檢查錯誤以及優雅地處理這些錯誤要比嘗試提前判斷操作是否成功要好得多。

我目前正在做以下事情:

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

我應該注意其他任何邊境案件嗎?

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

如果我嘗試刪除不存在的文件,我會收到錯誤。 然而,詢問文件是否存在似乎是不鼓勵的:

建議不要嘗試基於文件系統的當前狀態或文件系統上的特定文件來預測行為。 這樣做可能會導致奇怪的行為或競爭條件。 嘗試執行操作(例如加載文件或創建目錄),檢查錯誤以及優雅地處理這些錯誤要比嘗試提前判斷操作是否成功要好得多。

正確的方法就是它所說的:嘗試一下,看看你是否收到錯誤。

有些錯誤,特別是沒有這樣的文件,你可以忽略。 其他人,您可能想嘗試恢復 - 例如,如果錯誤與權限相關,您可能會嘗試要求管理員權限。 任何致命的東西,你應該呈現給用戶。

我目前正在做以下事情:

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

我應該注意其他任何邊境案件嗎?

是:

  • 當方法成功時,不保證error設置為nil (或根本不設置)。 您應首先檢查方法是否已失敗,並且只有在方法確實返回失敗時才嘗試使用error
  • NSError同時具有域和代碼。 你只是檢查其中一個。 代碼的含義由域決定; 例如,4表示Cocoa錯誤域中的“無此文件”,但POSIX錯誤域中的“中斷系統調用”和OSStatus錯誤域中的“除以零”。 這就是為什么你需要比較兩個域名和你的測試錯誤代碼。
  • 如果此代碼在主線程的任何線程上運行,則使用defaultManager是錯誤的。 創建自己的NSFileManager對象並使用該對象。
  • 登錄到控制台足以在開發期間進行調試,但是您應該將其更改為presentError:消息(在主線程上,如果您還沒有)在警報框中將其報告給用戶。

認為你是在標記。 我唯一要做的就是使用NSFileManagerDelegate來決定在刪除文件之前/之后要做什么(出錯時)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM