羅伯特有正確答案(只是通過在適當的標誌fs.writeFile(fname, data, { flag : 'wx' }, ...)
),但我想我會解釋爲什麼不建議使用fs.stat()
隨後fs.writeFile()
。當你做這樣的事情:
fs.stat(fname, function(err) {
if (err) {
// in the bit of time right here, there is a race condition
fs.writeFile(fname, data, function(err) {
// file written
});
}
});
有一個競爭條件。在任何類型的多進程系統或與其他系統共享的任何類型的文件系統中,可能存在fs.stat()
報告該文件不存在的情況,但在該時刻和實際調用fs.writeFile()
之間的某個其他進程或線程或計算機寫入該文件,現在您剛剛覆蓋了您不想執行的現有文件。所以,這在某些情況下根本不可靠,因此不推薦。
你需要的是一個原子操作,它將檢查它是否存在,如果不存在,它會爲你創建它。這將給你一個可靠的系統,使文件永遠不會被意外覆蓋。
通過傳遞wx
標誌來fs.writeFile()
,你告訴底層操作系統僅在文件不存在寫這些字節的文件,它會以原子方式不具備做多線程/過程/計算機競賽條件。
是有限制的競爭條件和有你的系統實際上不會受到它(只都不能寫入該文件的一個Node.js的過程)的情況下,但它只是更安全只是總是以安全的方式進行編碼,無論如何,實際上,安全的方式就是代碼少。
我想我們都有這種感覺,值得更多的解釋:D – robertklep
@robertklep - 是的,在評論中提到的OP,他們不明白原因和你的答案(我upvoted)沒有包含解釋在我寫了這個。 – jfriend00
是的,我也意識到,指出_why_這不是推薦:)是一件好事:) – robertklep