2016-10-26 167 views
5

我閱讀手冊stat方法here和它說:爲什麼使用FSTAT不建議

使用fs.stat()來檢查文件是否存在調用 fs.open(前),不建議使用fs.readFile()或fs.writeFile()。 而是,用戶代碼應該直接打開/讀取/寫入文件,並處理文件不可用時引發的錯誤 。

要檢查一個文件是否存在而未經過處理, 建議使用fs.access()。

所以,我有兩個問題:

  • 爲什麼使用錯誤處理程序優先的方式在fs.stat()檢查文件是否存在?

  • 而且由於我可以用fs.access()來檢查文件是否存在,是否使用error handler機制仍然是首選的方法來確保文件是否打開?

我想我已經找到了答案,第二個問題:

使用fs.access()來檢查文件的可訪問性 之前調用fs.open(),FS。不建議使用readFile()或fs.writeFile()。 這樣做會引入爭用條件,因爲其他進程可能會在兩次調用之間更改文件的狀態。相反,如果 文件不可訪問,用戶代碼應該直接打開/讀取/寫入文件並處理髮生的錯誤 。

所以可能fs.open()阻止文件的其他進程,而fs.stat()fs.access()簡單地請求信息和其他進程仍然可以修改/刪除文件。

+0

除非這些文檔的作者已經解釋了爲什麼某處(因爲他們認爲不需要在文檔中解釋它),所有人都可以做的是推測,這在SO上並不真正有用。例如,有一種推測是,它的工作量較少,比如fs。stat'必須獲得關於該文件的更多信息。但... –

+0

另外:你的問題是關於*第二段引用的段落,對嗎?第一個引用的段落與'fs.access'沒有任何關係(並且清楚地說明了*建議的原因)。 –

+1

[有用的評論](http://stackoverflow.com/questions/32748530/on-linux-is-access-faster-than-stat#comment53341880_32748530) – robertklep

回答

3

我相信,應當明確在這裏,無論fs.statfs.access不推薦用於檢查文件的打開它之前可訪問的特定情況下。在問題中也提到,這可能會引發競爭狀況。由於這個原因(和其他一些與API有關的),功能exists()existsSync()已被棄用(在版本4左右):它們經常被用於此目的。

當試圖打開文件時,如果該文件不可訪問,該操作將已經觸發錯誤。因此,這種檢查應該在這裏處理。否則,有more than one reasonable way to check if a file exists

另請注意,截至版本6.8.0,existsSync()不推薦!見discussion6.8.0 changelog。以上規則同樣適用:只有在您不打算在此之後打開文件時才使用它。

相關問題