Проверка существования файла в 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'); }

Проверьте, существует ли файл test.txt. Если существует, прочитайте его текст.

Другие флаги

В наш метод 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'); }