Подтвердить что ты не робот

Fs.exists, fs.existsSync - почему они устарели?

Я заметил, что официальная документация node говорит что-то потрясающее о fs.exists:

"fs.exists() является анахронизмом и существует только по историческим причинам. В его собственном коде не должно быть причин использовать его.

В частности, проверка наличия файла перед его открытием анти-шаблон, который оставляет вас уязвимыми для условий гонки: другой процесс может удалить файл между вызовами fs.exists() и fs.open(). Просто откройте файл и обработайте ошибку, если она не там".

Я понимаю предложение, чтобы открыть файл, а затем обработать ошибку, если она не существует, но я не понимаю, почему интерфейс устарел, а не просто меняет реализацию.

Может ли кто-нибудь объяснить мне, почему проверка существования файла с api, который так же прост и логичен, как fs.exists, настолько плоха, что его следует называть анти-шаблоном и удалять из node API?

4b9b3361

Ответ 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!');
    }
});