15

Проверьте синхронно, существует ли файл/каталог в Node.js

32

Как я могу синхронно проверить, существует ли файл или директория, используя node.js?

5 ответ(ов)

0

На вопрос о том, как проверить существование файла в Node.js, исходя из рекомендуемых API (на 2015 год), можно рассмотреть следующий пример:

var fs = require('fs');

function fileExists(filePath) {
    try {
        return fs.statSync(filePath).isFile();
    } catch (err) {
        return false;
    }
}

Однако, в ответ на замечание пользователя @broadband о проблеме EPERM следует отметить важный момент. Функция fileExists() может не являться хорошим подходом в многих ситуациях, поскольку она не может гарантировать булевый результат. Вы можете точно определить, существует ли файл или нет, но также можете получить ошибку разрешений. Ошибка разрешений не обязательно подразумевает, что файл существует, так как у вас может не быть прав доступа к каталогу, содержащему файл, который вы проверяете. Кроме того, возможны и другие ошибки при попытке проверить существование файла.

Таким образом, мой код на самом деле проверяет наличие файла и наличие доступа к нему, в то время как ваш вопрос, возможно, сводится к теме отсутствия файла и возможности его создания — это совершенно другая логика, которая должна учитывать, среди прочего, ошибки EPERM.

Хотя ответ с использованием fs.existsSync напрямую отвечает на заданный вопрос, зачастую это не совсем то, что вам нужно (вы хотите не просто узнать, существует ли "что-то" по указанному пути, а интересуетесь, является ли "это" файлом или каталогом).

Итог таков: если вы проверяете существование файла, вероятнее всего, вы собираетесь предпринять какие-то действия на основании результата, и эта логика (проверка и/или последующее действие) должна учитывать тот факт, что по указанному пути может находиться как файл, так и каталог, а также возможность возникновения ошибок EPERM и других ошибок в процессе проверки.

0

Еще одно обновление

Ищущим ответ на этот вопрос, как и мне, настоятельно рекомендую ознакомиться с документацией Node.js. Выясняется, что не стоит использовать fs.exists, вместо этого следует применять fs.open и обрабатывать ошибку, чтобы определить, существует ли файл.

Из документации:

fs.exists() — это анахронизм, который существует лишь по историческим причинам. Практически никогда не должно быть причины использовать его в вашем собственном коде.

В частности, проверка существования файла перед его открытием является антишаблоном, который делает вас уязвимыми к состояниям гонки: другой процесс может удалить файл между вызовами fs.exists() и fs.open(). Просто откройте файл и обработайте ошибку, если его нет.

Ссылка на полную документацию: Node.js fs.exists

0

Для проверки существования папки в Node.js можно использовать метод fs.existsSync. Вот как вы можете это реализовать:

const fs = require('fs');

const pathToCheck = '<путь_к_которому_необходимо_сделать_проверку>';
const folderName = '<имя_папки>';

if (fs.existsSync(pathToCheck)) {
  // Код, который будет выполнен, если папка существует.
} else {
  // Код для создания папки, если её нет.
  fs.mkdir(folderName, (err) => {
    if (err) {
      console.error('Ошибка при создании папки:', err);
    } else {
      console.log('Папка успешно создана.');
    }
  });
}

Здесь замените <путь_к_которому_необходимо_сделать_проверку> на путь, который вы хотите проверить, а <имя_папки> на имя папки, которую необходимо создать. Обратите внимание, что fs.mkdir принимает колбэк для обработки ошибок, если создание папки не удалось.

0

fs.exists() устарел, поэтому не рекомендуется его использовать. Вместо этого, вы можете применить более современный метод с помощью fs.statSync(), как показано в следующем примере:

function statPath(path) {
  try {
    return fs.statSync(path);
  } catch (ex) {
    // Обработка ошибки (например, файл не найден)
  }
  return false;
}

Этот код будет возвращать объект статистики файла. Затем, когда вы получили объект статистики, вы можете проверить, существует ли файл и является ли он файлом:

var exist = statPath('/path/to/your/file.js');
if (exist && exist.isFile()) {
  // Выполните необходимые действия
}

Таким образом, этот подход позволяет избежать использования устаревших методов и предоставляет более безопасный способ проверки существования файла.

0

Модуль path не предоставляет синхронную версию функции path.exists, поэтому для решения этой задачи нужно использовать модуль fs и немного "обмануть" его.

Самый быстрый способ, который я могу предложить, — это использовать fs.realpathSync. Эта функция выбросит ошибку, если путь не существует, поэтому вам нужно создать собственную обёртку с использованием оператора try/catch. Вот пример реализации:

const fs = require('fs');

function existsSync(path) {
    try {
        fs.realpathSync(path);
        return true; // Путь существует
    } catch (err) {
        return false; // Путь не существует
    }
}

// Пример использования
console.log(existsSync('/path/to/check')); // true или false

Таким образом, вы сможете получить синхронный способ проверки существования пути.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь