Fs.exists, fs.existsSync - почему они устарели?
Я заметил, что официальная документация node говорит что-то потрясающее о fs.exists:
"fs.exists() является анахронизмом и существует только по историческим причинам. В его собственном коде не должно быть причин использовать его.
В частности, проверка наличия файла перед его открытием анти-шаблон, который оставляет вас уязвимыми для условий гонки: другой процесс может удалить файл между вызовами fs.exists() и fs.open(). Просто откройте файл и обработайте ошибку, если она не там".
Я понимаю предложение, чтобы открыть файл, а затем обработать ошибку, если она не существует, но я не понимаю, почему интерфейс устарел, а не просто меняет реализацию.
Может ли кто-нибудь объяснить мне, почему проверка существования файла с api, который так же прост и логичен, как fs.exists, настолько плоха, что его следует называть анти-шаблоном и удалять из node API?
Ответы
Ответ 1
Я думаю, потому что он лишний. Вы можете проверить, существует ли файл, пытаясь его открыть. Он даст вам ENOENT
, если он не существует:
> fs.open('foo', 'r', function(err, fd) {
... console.log(err, fd);
...
})
undefined
> { [Error: ENOENT, open 'foo'] errno: 34, code: 'ENOENT', path: 'foo' } undefined
Ответ 2
Из-за второго абзаца, который вы указали.
Нет смысла проверять, существует ли файл, поскольку он всегда можно удалить сразу после проверки.
Ответ 3
Быть устаревшим, потому что это анти-шаблон в соответствии с некоторыми. То есть это небезопасно, чтобы доверять существует(), а затем что-то делать с файлом, потому что файл можно удалить между вызовом exist и вызовом do-something.
Я согласен в приведенном выше случае. Но для меня больше пользы существует(). Я помещаю пустые фиктивные файлы в свои временные и кэш-каталоги. Когда я выполняю опасные операции, такие как удаление старых файлов из каталога кеша, я ищу свой фиктивный файл, чтобы убедиться, что я не работаю в неправильном каталоге. То есть Мне просто нужно подтвердить, что файл есть. Existing отлично подходит для этого счета, но я думаю, что я переключусь на использование stat().
Ответ 4
Нет необходимости использовать fs.stat(), потому что fs.existsSync() не устарели.
https://nodejs.org/api/fs.html#fs_fs_existssync_path
fs.existsSync(путь)
Добавлено в: v0.1.21 путь | Синхронная версия fs.exists(). Возвращает true, если файл существует, в противном случае - false.
Обратите внимание, что fs.exists() устарел, но fs.existsSync() не. (Параметр callback > для fs.exists() принимает параметры, которые несовместимы с другими обратными вызовами > Node.js. Fs.existsSync() не использует обратный вызов.)
Ответ 5
existsSync реализуется так (v0.10.25):
function (path) {
try {
nullCheck(path);
binding.stat(pathModule._makeLong(path));
return true;
} catch (e) {
return false;
}
}
поэтому, если вы пишете программу, например if (fs.existsSync(thepath)) {}, лучше изменить ее на if (fs.statSync(thepath)) {}.
Ответ 6
Я искал решение этой проблемы и обнаружил, что fs.exists и fs.existsSync устарели. Это, кажется, хорошо работает в моем senario
fs.readFile(filename, 'utf8', function(err,data){
// the err variable substitutes for the fs.exists callback function variable
if (!err){
// do what you planned with the file
console.log(data)
}else{
// handle the non-existence of the file
console.log('File does not exist!');
}
});
Ответ 7
Вы можете использовать новую установку для этого и продолжать использовать ее:
https://github.com/imyller/node-fs-exists-nodeback
npm install fs-exists-nodeback