Я запускаю скрипт Node и получаю эту ошибку по этому пути:
ENOENT ../../../Library/Application Support/Google/Chrome/RunningChromeVersion
Я могу устранить ошибку, закрыв Chrome.
Большая часть моих поисков в Google подсказала мне, чтоЭНОЕНТошибки вызваны файлами/папками, которые не существуют.
Однако в данном случае папка явно существует и связана с тем, что Chrome запущен.
Я хочу иметь возможность перемещаться по файлам, даже если они используются. Это возможно?
Большинство других ошибок вызваны Apple, а у меня компьютер Apple.
ENOENT ../../../Library/Containers/com.apple..NowPlayingWidgetContainer/Data/Documents/iChats
решение1
Названный элемент RunningChromeVersion
существует, но этосимволическая ссылкачейцельне существует. Ваш скрипт Node не обрабатывает ссылки особым образом, поэтому при попытке их открытия действие по умолчанию — перейти по ссылке.
Цель ссылки не существует, поскольку она изначально не предназначена для указания на файл. Это фиктивная ссылка с некоторой несвязанной информацией (например, номером версии), хранящейся в поле «цель», где обычно находится имя файла.
Например, вот эквивалент для Linux (обратите внимание на l
указание «типа»):
$ ls -l ~/.config/chromium всего 4.2M ... drwx------ 3 пользователя grawity 4.0K 14 мая 09:52 ShaderCache/ лrwxrwxrwx 1 grawity пользователи 20 мая 17 13:38 SingletonCookie-> 18396286875963223082 лrwxrwxrwx 1 grawity пользователи 12 мая 17 13:38 SingletonLock-> мороз-453916 лrwxrwxrwx 1 grawity пользователи 50 17 мая 13:38 SingletonSocket-> /tmp/.org.chromium.Chromium.7Og2ow/SingletonSocket= drwx------ 3 пользователя grawity 4.0K 27 дек 08:02 SSLErrorAssistant/ ...
Это довольно распространенный метод создания «файлов блокировки»: для атомарного создания ссылки (и сбоя, если она уже существует) требуется всего один системный вызов, для чтения ее «содержимого» (поле «target») — один системный вызов, и я думаю, что он даже совместим с NFS/SMB/AFS, тогда как реальные блокировки файлов, как правило, работают не так хорошо с этими сетевыми файловыми системами.
Если вы используете readdir() для сканирования каталогов, то каждая запись каталога уже содержит информацию о своем типе: например, в Node вы можете вызвать.isSymbolicLink()
для каждого результата readdir.
Если у вас есть только путь, вы можете использовать эквивалент Nodelstat()
функция для проверки, является ли путь символической ссылкой, и избегания его прохождения таким образом (также есть возможность readlink()
прочитать его поле «target», если вы хотите).
Это на самом делерекомендуемыедля пропуска символических ссылок при рекурсивном поиске файлов, поскольку следование символическим ссылкам может привести к бесконечному циклу (например, dirA/linkB указывает на ../dirB, но dirB/linkA указывает на ../dirA, и теперь вы застряли).