Проверка существования файла в NodeJS

Давайте научимся проверять существование файла или папки. В современном NodeJS это делается особым образом через метод fs.access, проверяющий возможность доступа к файлу.

Для начала импортируем асинхронную часть модуля fs:

javascriptimport fs from 'fs/promises';

Теперь из общей части модуля fs импортируем специальные константы:

javascriptimport { constants } from 'fs';

После этого в переменной constants будет специальный объект с константами, содержащими специальные флаги, которые мы будем передавать параметром в метод access, изменяя его поведение.

Следующий флаг используется для проверки существования файла:

javascriptconstants.F_OK

Давайте с помощью этого флага проверим существование файла test.txt:

javascriptfs.access('test.txt', constants.F_OK);

Наш метод access своим резульатом возвращает промис. Если файл существует, но промис зарезолвится, а если нет - то зареджектится:

javascriptfs.access('test.txt', constants.F_OK).then(() => {
  console.log('file exists');
}).catch(() => {
  console.error('file does not exists');
});

Давайте перепишем наш код через await. Для этого обернем вызов access в конструкцию try-catch:

javascripttry {
  await fs.access('test.txt', constants.F_OK);
  console.log('file exists');
} catch {
  console.error('file does not exists');
}
Задание 1

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

Другие флаги

В наш метод access можно передавать и другие флаги. К примеру, следующий флаг используется для проверки разрешения на чтение файла:

javascriptconstants.R_OK

А следующий флаг используется для проверки разрешения на запись файла:

javascriptconstants.W_OK

Давайте выполним проверку файла на возможность чтения:

javascripttry {
  await fs.access('test.txt', constants.R_OK);
  console.log('can read');
} catch {
  console.error('cannot read');
}

А теперь выполним проверку файла на возможность записи:

javascripttry {
  await fs.access('test.txt', constants.W_OK);
  console.log('can write');
} catch {
  console.error('cannot write');
}

А теперь проверим файл и на то, и на другое:

javascripttry {
  await fs.access('test.txt', constants.R_OK | constants.W_OK);
  console.log('can access');
} catch {
  console.error('cannot access');
}