我正在運行 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,現在您被卡住了) 。