exists()
) и последующей операцией (open()
, readFile()
и т.д.) файл может быть удален/изменен// Проблемный код:
if (fs.existsSync('file.txt')) {
// Файл может быть удален здесь!
fs.readFile('file.txt', (err, data) => {...});
}
Асинхронный API не соответствует Node.js стилю:
fs.exists()
использовал нестандартный callback (без ошибки первым аргументом)Избыточность:
ENOENT
если файла нетЛучший подход — просто выполнять нужную операцию и обрабатывать ошибку:
fs.readFile('file.txt', (err, data) => {
if (err && err.code === 'ENOENT') {
// Файл не существует
} else if (err) {
// Другая ошибка
} else {
// Работа с данными
}
});
Для случаев, когда действительно нужно проверить доступ:
// Асинхронная версия
fs.access('file.txt', fs.constants.F_OK, (err) => {
if (err) {
console.log('Файл не существует');
} else {
console.log('Файл доступен');
}
});
// Синхронная версия
try {
fs.accessSync('file.txt', fs.constants.F_OK);
console.log('Файл доступен');
} catch (err) {
console.log('Файл не существует');
}
async function checkFileExists(file) {
try {
await fs.promises.access(file, fs.constants.F_OK);
return true;
} catch {
return false;
}
}
Редкие случаи, когда уместна проверка:
fs.exists()
/fs.existsSync()
— они deprecated не просто такENOENT
fs.access()
для явной проверкиexists()
:
Правильный подход — всегда учитывать возможность ошибки при работе с файловой системой, а не делать предварительные проверки.