Проверка существования файла в NodeJS
Давайте научимся проверять существование файла или папки. В современном NodeJS это делается особым образом через метод fs.access, проверяющий возможность доступа к файлу.
Для начала импортируем асинхронную часть модуля fs:
import fs from 'fs/promises';
Теперь из общей части модуля fs импортируем специальные константы:
import { constants } from 'fs';
После этого в переменной constants будет специальный объект с константами, содержащими специальные флаги, которые мы будем передавать параметром в метод access, изменяя его поведение.
Следующий флаг используется для проверки существования файла:
constants.F_OK
Давайте с помощью этого флага проверим существование файла test.txt:
fs.access('test.txt', constants.F_OK);
Наш метод access своим резульатом возвращает промис. Если файл существует, но промис зарезолвится, а если нет - то зареджектится:
fs.access('test.txt', constants.F_OK).then(() => {
console.log('file exists');
}).catch(() => {
console.error('file does not exists');
});
Давайте перепишем наш код через await. Для этого обернем вызов access в конструкцию try-catch:
try {
await fs.access('test.txt', constants.F_OK);
console.log('file exists');
} catch {
console.error('file does not exists');
}
Другие флаги
В наш метод access можно передавать и другие флаги. К примеру, следующий флаг используется для проверки разрешения на чтение файла:
constants.R_OK
А следующий флаг используется для проверки разрешения на запись файла:
constants.W_OK
Давайте выполним проверку файла на возможность чтения:
try {
await fs.access('test.txt', constants.R_OK);
console.log('can read');
} catch {
console.error('cannot read');
}
А теперь выполним проверку файла на возможность записи:
try {
await fs.access('test.txt', constants.W_OK);
console.log('can write');
} catch {
console.error('cannot write');
}
А теперь проверим файл и на то, и на другое:
try {
await fs.access('test.txt', constants.R_OK | constants.W_OK);
console.log('can access');
} catch {
console.error('cannot access');
}