2016-11-25 18 views
0

爲fileExistsAtPath的文檔讀取:我們如何才能得到肯定確認文件*不存在於iOS中?

返回YES如果在規定的路徑上的文件存在,或NO如果文件 不存在或它的存在不能被確定。

這似乎阻止我們使用這種方法來獲取文件的沒有的肯定確定。如果我們得到一個NO回來,它可能可能的意思是文件不存在,但它也可能意味着操作系統無法分辨。因此,確保文件不存在的最佳方式是什麼?

回答

4

只要你沒有對文件或文件夾的屬性做任何奇怪的事情,只要你只在你的應用程序的沙箱中工作,那麼使用fileExistsAtPath會給你你需要的答案。

只有在嘗試訪問應用沙盒外的文件時,或者如果您開始弄亂應用沙箱內的文件夾屬性,例如刪除讀取或執行文件夾的能力,纔會出現「無法確定」 。

+0

謝謝。請問你如何知道這是真的?有關於它的文檔嗎? –

+2

它的作用是使用Unix風格的操作系統30年,並自App Store開啓以來一部分編寫文件密集型iOS應用程序。我不知道是否有任何類似的具體文件。 – rmaddy

4

Apple建議不要依賴fileExistAtPath:方法。如果文件不存在,試着打開文件並處理錯誤通常會更好。

的NSFileManager類參考

注:試圖謂詞基於文件系統或文件系統中的特定文件的當前狀態的行爲是不推薦。這樣做會造成奇怪的行爲或競賽狀況。嘗試一個操作(例如加載文件或創建目錄),檢查錯誤並妥善處理這些錯誤要比試圖提前弄清操作是否成功要好得多。有關文件系統爭用條件的更多信息,請參閱安全編碼指南中的「爭用條件和安全文件操作」。 來自安全編碼指南。

而且從"Secure Coding Guide"

爲了防止這種情況,程序經常檢查,以確保一個臨時文件具有特定名稱並不在目標目錄中已經存在。如果存在這樣的文件,應用程序將刪除它或爲臨時文件選擇一個新名稱以避免衝突。如果文件不存在,應用程序將打開文件進行寫入,因爲打開文件進行寫入的系統例程會自動創建一個新文件(如果不存在)。

攻擊者通過持續運行一個程序來創建一個具有合適名稱的新臨時文件,可以(在保持一點點運氣的情況下)在應用程序檢查時確保臨時文件並不存在,當它打開寫作。然後應用程序打開攻擊者的文件並寫入它(請記住,系統例程會打開一個現有文件(如果有的話),並且僅在沒有現有文件時才創建一個新文件)。

攻擊者的文件可能具有與應用程序的臨時文件不同的訪問權限,因此攻擊者可以讀取內容。或者,攻擊者可能已經打開文件。攻擊者可以使用硬鏈接或其他文件(攻擊者擁有的文件或現有系統文件)的一個硬鏈接或符號鏈接替換文件。例如,攻擊者可以通過與系統密碼文件的符號鏈接替換該文件,以便在攻擊之後,系統密碼已損壞,以至於沒有人(包括系統管理員)可以登錄。

相關問題