是什麼導致 ENOENT 錯誤?

是什麼導致 ENOENT 錯誤?

我正在運行 Node 腳本,並在此路徑上收到此錯誤:

 ENOENT ../../../Library/Application Support/Google/Chrome/RunningChromeVersion

我可以透過關閉 Chrome 來消除該錯誤。

我的大部分谷歌搜尋都告訴我埃諾特錯誤是由不存在的文件/資料夾引起的。

然而,在這種情況下,該資料夾顯然存在,並且與 Chrome 正在運行的事實有關。

我希望能夠遍歷這些文件,即使它們正在使用中。這可能嗎?

大多數其他錯誤都是由Apple引起的,而我使用的是Apple機器。

ENOENT ../../../Library/Containers/com.apple..NowPlayingWidgetContainer/Data/Documents/iChats

答案1

名為的項目RunningChromeVersion存在,但它是符號連結誰的目標不存在。您的 Node 腳本不會對連結進行任何特殊處理,因此嘗試開啟連結時的預設操作是點擊連結。

該連結的目標不存在,因為它本來就不打算指向文件。它是一個虛擬鏈接,其中包含一些不相關的資訊(例如版本號),儲存在文件名通常所在的“目標”欄位中。

例如,這是 Linux 上的等效項(注意l「類型」指示):

$ ls -l ~/.config/chromium
總計 420 萬
drwx------ 3 grawity 使用者 4.0K 五月 14 09:52 ShaderCache/
rwxrwxrwx 1 grawity 用戶 20 May 17 13:38 SingletonCookie-> 18396286875963223082
rwxrwxrwx 1 grawity 用戶 12 May 17 13:38 SingletonLock-> 霜-453916
rwxrwxrwx 1 grawity 用戶 50 五月 17 13:38 SingletonSocket-> /tmp/.org.chromium.Chromium.7Og2ow/SingletonSocket=
drwx------ 3 grawity 用戶 4.0K 12 月 27 日 08:02 SSLErrorAssistant/

這是建立「鎖定檔案」的常見方法;它只需要一個系統呼叫來原子地創建一個連結(如果它已經存在就會失敗),一個系統呼叫來讀取它的「內容」(「目標」欄位),我認為它甚至是NFS/SMB/AFS相容的,而實際檔案鎖在這些網路檔案系統上的工作效果往往較差。

如果你使用 readdir() 來掃描目錄,那麼每個目錄條目已經有關於它的類型的資訊:例如在 Node 中,你可以呼叫.isSymbolicLink()在每個 readdir 結果上。

如果您只有路徑,則可以使用與lstat()函數來檢查路徑是否為符號連結並避免以這種方式遍歷它(readlink()如果需要,也可以讀取其「目標」欄位)。

它實際上是受到推崇的在進行遞歸文件搜索時跳過符號鏈接,因為跟隨符號鏈接可能會導致您進入無限循環(例如dirA/linkB 指向../dirB,但dirB/linkA 指向../dirA,現在您被卡住了) 。

相關內容