簡體   English   中英

如何檢查文件是否可寫(資源不忙也不鎖定)

[英]How to check file is writable (resource is not busy nor locked)

excel4node寫入文件函數捕獲錯誤並且不會傳播給調用者。 因此,我的應用程序無法確定寫入文件是否成功。

我目前的解決方法如下:

let fs = require('fs')
try {
  let filePath = 'blahblah'
  fs.writeFileSync(filePath, '') // Try-catch is for this statement
  excel4nodeWorkbook.write(filePath)
} catch (e) {
  console.log('File save is not successful')
}

它有效,但我認為這是一種黑客行為,並且在語義上不是正確的方式。 我還測試了fs.accessfs.accessSync ,但它們只檢查權限,而不是資源的狀態(忙/鎖定)。

是否有任何建議可以在不修改 excel4node 源代碼的情況下使其外觀和行為更好?

我認為你問錯了問題。 如果你在時間 T 檢查,然后在時間 T + 1ms 寫入,如何保證文件仍然是可寫的?

如果該文件由於某種原因不可寫,則寫入將失敗,期間。 沒事做。 您的代碼很好,但您可能也可以不用fs.writeFileSync() ,它只會擦除文件中之前的任何其他內容。

您還可以寫入隨機生成的文件路徑,以合理確保兩個進程不會同時寫入同一個文件,但同樣,這不會阻止所有可能的寫入錯誤,所以您真正想要的是而是一些很好的錯誤處理。

為了正確處理錯誤,您必須提供回調

類似的東西:

excel4nodeWorkbook.write(filePath, (err) => {
  if (err) console.error(err);
});

請注意,這是異步代碼,因此您也需要處理它!

您已經在庫的源代碼中標記了一行。 如果您查看上面的幾行,您可以看到它使用handler參數將任何錯誤傳遞給。 事實上,查看函數上方的文檔注釋,它說:

如果給定回調,則通過 (err, fs.Stats) 調用回調

因此,您可以簡單地傳遞一個函數作為您的第二個參數並檢查err就像您可能已經在節點環境中的其他地方看到的一樣:

excel4nodeWorkbook.write(filepath, (err) => {
    if (err) {
        console.error(err);
    }
});

暫無
暫無

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

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