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

Node.js fs.exists() будет устаревшим, что использовать вместо этого?

В соответствии с документацией node.js fs.exists() будет устаревшим. Их рассуждения:

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

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

fs.exists() будет устаревшим.

В настоящее время я использую его перед перемещением файлов, так как fs.rename(), похоже, спокойно перезаписывает файлы с тем же именем в целевой папке.

Мой вопрос: что я должен использовать вместо этого, чтобы fs.rename() не перезаписывал файл в папке назначения? Я предполагаю, что я не знаю. В противном случае я не вижу причины, по которым fs.exists() устарел.

Использование fs.open(), как было предложено, кажется излишним, поскольку я не хочу открывать файл.


Изменить, согласно запросу @jfriend00 для получения дополнительной информации о том, что я делаю.

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

function moveFile(destIndex){
    var from = queue[currentQueueIndex].path;
    var to = destinations[destIndex].path + path.sep + path.basename(from);
    console.log("[i] Move file (from/to): ");
    console.log(from);
    console.log(to);

    //Check if file exists, if yes: give them the choice to cancel.
    fs.stat(to, function (err, stats) {
        if (err){
            move(from, to);
        } else {
            var confirmed = confirm("File already exists, will overwrite.");
            if (confirmed) {
                move(from, to);
            }
        }
    });
    next(); //Show the next file to the user
}

function move(from, to){
    fs.rename(from, to, function (err) {
        if (err) throw err;
        console.log('[i] Move successful');
        queue[currentQueueIndex].path = to;
        queue[currentQueueIndex].moved = true;
    });
}

После первого комментария, часть, начинающаяся с fs.stat, я проверяю, существует ли файл, который я собираюсь создать с помощью fs.rename. Я предполагаю, что это зависит от условий гонки, но я не могу найти, что fs.rename обрабатывает дубликаты любым способом.
Поскольку это приложение предназначено для "домашних вычислений", я не думаю, что сценарий, где файл исчезает между проверкой stat и, вероятно, будет иметься переименование. Но тем не менее, чем больше потенциальных проблем я могу избежать, тем лучше.

4b9b3361

Ответ 1

io.js docs упоминают использование fs.stat() или fs.access() вместо fs.exists().

Ответ 2

Используйте fs.existsSync().

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() не использует обратный вызов.)

Ответ 3

Вот пример, используя fs.stat: -

fs.stat('mycustomfile.csv', function (err, stats) {
   console.log(stats);//here we got all information of file in stats variable
   if (err) {
       return console.error(err);
   }
     fs.unlink('mycustomfile.csv',function(err){
        if(err) return console.log(err);
        console.log('file deleted successfully');
   });  
});