В соответствии с документацией 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 и, вероятно, будет иметься переименование. Но тем не менее, чем больше потенциальных проблем я могу избежать, тем лучше.