Проверить существует ли файл node js

Обновлено: 05.07.2024

Как я могу проверить существование file?

в документации к модулю fs есть описание метода fs.exists(path, callback) . Но, как я понимаю, он проверяет наличие только каталогов. И мне нужно проверить file!

Как это можно сделать?

почему бы просто не попробовать открыть файл ? fs.open('YourFile', 'a', function (err, fd) < . >) в любом случае после минутного поиска попробуйте это :

Для Узла.с JS версии v0.12.X и выше

и path.exists и fs.exists были удалены

С помощью fs.характеристика:

есть более простой способ сделать это синхронно.

API doc говорит, как existsSync работы:
проверьте, существует ли данный путь, проверив файловую систему.

альтернативой для stat может быть использование нового fs.access(. ) :

уменьшенная короткая функция посыла для проверять:

пример использования:

расширенный обещаю образом:

или если вы хотите сделать это синхронно:

fs.exists была прекращена с 1.0.0. Вы можете использовать fs.stat вместо этого.

вот ссылка на документацию fs.статистика

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

этот метод использует обещания, предполагая, что вы работаете с асинхронного кода:

если файл не существует, обещание все равно разрешается, хотя false . Если файл действительно существует, и это каталог, то он разрешается true . Любые ошибки при попытке прочитать файл будут reject обещание сама ошибка.

async/await версию с помощью util.promisify начиная с узла 8:

the docs говорят, что вы должны использовать access() в качестве замены устаревшим exists()

fs-extra

как вы видите, гораздо проще. И преимущество перед promisify заключается в том, что у вас есть полные типизации с этим пакетом (полный intellisense/typescript)! Большинство случаи, когда вы уже включили эту библиотеку, потому что (+-10.000) другие библиотеки зависят от нее.

Как я могу проверить наличие файла ?

В документации к модулю fs есть описание метода fs.exists(path, callback) . Но, насколько я понимаю, проверяет наличие только каталогов. И мне нужно проверить файл !

Как это может быть сделано?

По состоянию на 2018 год используйте fs.access('file', err => err ? 'does not exist' : 'exists') , см. Fs.access

Почему бы просто не попробовать открыть файл? fs.open('YourFile', 'a', function (err, fd) < . >) в любом случае после минутного поиска попробуйте следующее:

Для Node.js v0.12.x и выше

Оба path.exists и fs.exists устарели

Изменено: else if(err.code == 'ENOENT')

кому: else if(err.code === 'ENOENT')

Линтер жалуется, что двойное равенство не является тройным равенством.

Но, как оказалось, fs.exists тоже работает. У меня возникли проблемы с правами доступа к файлу. path.exists на самом деле устарел в пользу fs.exists Любой, кто читает это сейчас (Node.js v0.12.x), должен помнить об этом, fs.exists и fs.existsSync они также устарели. Лучший способ проверить существование файла fs.stat , как показано выше. Из документации Node js кажется, что лучший способ, если вы планируете открыть файл после проверки его существования, - это фактически открыть его и обработать ошибки, если они не существуют. Поскольку ваш файл может быть удален между вашей проверкой существования и функцией открытия . @Antrikshy fs.existsSync больше не издевается, хотя и fs.exists остается.

Более простой способ сделать это синхронно.

Документ API говорит, как existsSync работает:
проверьте, существует ли данный путь, проверив файловую систему.

Изменить: с узла v10.0.0 мы могли бы использовать fs.promises.access(. )

Пример асинхронного кода, который проверяет, существует ли файл:

Альтернативой stat может быть новый fs.access(. ) :

минифицированная функция короткого обещания для проверки:

расширенный способ обещания:

или если вы хотите сделать это синхронно:

Проголосовали за, это определенно самый современный (2018) способ определить, существует ли файл в Node.js В документации нахожу fs.constants.F_OK и т. Д. А можно ли к ним как fs.F_OK ? Странно. Тоже лаконично, что приятно. Можно попробовать сделать это, fs.promises.access(path, fs.constants.F_OK); чтобы просто сделать это обещание вместо создания обещания. Я использовал еще более короткую версию этого: не существует: !(await fs.stat(path).catch(() => false)) существует: !!(await fs.stat(path).catch(() => false)) Ссылка, которую вы предоставили для fs.existsync, четко указывает на то, что она НЕ устарела "Обратите внимание, что fs.exists () устарела, а fs.existsSync () - нет. (Параметр обратного вызова для fs.exists () принимает параметры, которые несовместимы с другими обратными вызовами Node.js. fs.existsSync () не использует обратный вызов.) " первый (сверху) ответ, в котором упоминалось, откуда fs На момент написания этого ответа информация была верной; однако fs.existsSync() больше не рекомендуется к использованию.

Современный способ async / await (Node 12.8.x)

Нам нужно использовать, fs.stat() or fs.access() потому что fs.exists(path, callback) сейчас устарело

Еще один хороший способ - fs-extra

ОБНОВИТЬ

Оба fs.exists и fs.existsSync устарели в соответствии с предоставленной вами ссылкой. existsSync не является устаревшим в соответствии с этим документом, может быть, когда вы его читали.

fs.exists устарела с 1.0.0. Вы можете использовать fs.stat вместо этого.

Вот ссылка на документацию fs.stats

@Fox: отличный ответ! Вот небольшое расширение с дополнительными опциями. Это то, что я использовал в последнее время в качестве решения:

Есть много неточных комментариев по поводу fs.existsSync() устаревания; нет, это не так.

Обратите внимание, что fs.exists () устарел, а fs.existsSync () - нет.

async/await версия с использованием util.promisify узла 8:

После небольшого экспериментирования я обнаружил, что следующий пример fs.stat является хорошим способом асинхронной проверки существования файла. Он также проверяет, что ваш «файл» действительно является файлом (а не каталогом).

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

Если файл не существует, обещание все равно разрешается, хотя false . Если файл действительно существует, и это каталог, то он разрешается true . Любые ошибки при попытке прочитать файл будут reject обещать ошибку.

Есть ли с этим проблемы?

Раньше перед тем, как сесть, я всегда проверяю, есть ли стул, а затем сажусь в другом месте. У меня есть альтернативный план, например, сесть на тренера. Теперь сайт node.js предлагает просто перейти (не нужно проверять), и ответ будет таким:

в документации говорится, что вы должны использовать access() вместо устаревших exists()

Как видите, намного проще. И преимущество перед promisify в том, что с этим пакетом у вас есть полная типизация (полный intellisense / typescript)! В большинстве случаев вы уже включили эту библиотеку, потому что (+ -10,000) от нее зависят другие библиотеки.

Почему бы просто не попробовать открыть файл? fs.open('YourFile', 'a', function (err, fd) < . >) в любом случае после минутного поиска попробуйте следующее:

Для Node.js v0.12.x и выше

И path.exists , и fs.exists устарели

Изменено: else if(err.code == 'ENOENT')

Кому: else if(err.code === 'ENOENT')

Линтер жалуется, что двойное равенство не является тройным равенством.

Использование машинописного текста и fs / promises в node14

Лучше использовать fsp.readFile , чем fsp.stat или fsp.access по двум причинам:

  1. Наименее важная причина - на один доступ меньше.
  2. Возможно, что fsp.stat и fsp.readFile дадут разные ответы. Либо из-за тонких различий в задаваемых вопросах, либо из-за того, что статус файлов изменился между звонками. Таким образом, кодировщику придется кодировать две условные ветви вместо одной, и пользователь может увидеть больше вариантов поведения.

Для асинхронной версии! И с обещанной версией! Вот чистый простой способ!

Более практичный фрагмент моего кода, чтобы лучше проиллюстрировать:

Пример выше предназначен только для демонстрации! Я мог бы использовать событие ошибки потока чтения! Чтобы отловить любые ошибки! И пропустите два звонка!

Вы можете использовать fs.stat , чтобы проверить, является ли цель файлом или каталогом, и вы можете использовать fs.access , чтобы проверить, можете ли вы записать / прочитать / выполнить файл. (не забудьте использовать path.resolve , чтобы получить полный путь к цели)

Полный пример (TypeScript)

В документах говорится, что вам следует использовать access() вместо устаревшего exists()

Как видите, намного проще. И преимущество перед promisify в том, что у вас есть полный набор текста с помощью этого пакета (полный intellisense / typescript)! В большинстве случаев вы уже включили эту библиотеку, потому что (+ -10,000) от нее зависят другие библиотеки.

Раньше, прежде чем сесть, я всегда проверяю, есть ли стул, а затем сажусь в другом месте. У меня есть альтернативный план, например, сесть на тренера. Теперь сайт node.js предлагает просто перейти (не нужно проверять), и ответ выглядит так:

Есть ли с этим какие-то проблемы?

После небольшого экспериментирования я обнаружил, что следующий пример с использованием fs.stat является хорошим способом асинхронной проверки существования файла. Он также проверяет, является ли ваш "файл" действительно файлом (а не каталогом).

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

Если файл не существует, обещание все равно разрешается, хотя и false . Если файл действительно существует, и это каталог, то разрешается true . Любые ошибки при попытке чтения файла reject обещают ошибку как таковую.

Версия async/await с использованием util.promisify с Узла 8:

Есть много неточных комментариев об исключении fs.existsSync() ; Нет.

Обратите внимание, что fs.exists () устарел, а fs.existsSync () - нет.

fs.exists устарел с 1.0.0. Вместо этого вы можете использовать fs.stat .

Вот ссылка на документацию fs.stats

@Fox: отличный ответ! Вот небольшое расширение с дополнительными опциями. Это то, что я использовал в последнее время в качестве решения:

ОБНОВЛЕНИЕ

Современный способ async / await (Node 12.8.x)

Нам нужно использовать fs.stat() or fs.access() , потому что fs.exists(path, callback) теперь не рекомендуется

Еще один хороший способ - fs-extra.

Более простой способ сделать это синхронно.

В документе API рассказывается, как работает existsSync :
Проверьте, существует ли указанный путь, проверив файловую систему.

Доброго времени суток, друзья. Поговорим сегодня о работе с файлами в Node.js. Для работы с файлами используется модуль fs (сокращение от File System).

В этой статье мы рассмотрим следующие темы:

Для начала работы нам потребуется установленная Node.js. Подробную инструкцию по ее установке вы можете получить (тут).

Прежде чем начать работу с модулем, его следует импортировать в рабочем файле.

Пробежимся по основным методам этого модуля и посмотрим на примерах как с ними можно работать.

Работа с файловыми дескрипторами

Прежде чем двигаться дальше, давайте посмотрим на термины, о которых описано в статье ниже.

Файловый дескриптор — это неотрицательное целое число. Когда создается новый поток ввода-вывода, ядро возвращает процессу, создавшему поток ввода-вывода, его файловый дескриптор (Wikipedia).

Перейдем к примерам.

Ниже я приведу перечень флагов доступа к файлам

Следует помнить, что дескрипторы файлов необходимо закрывать для предотвращения переполнения памяти, а также проблем с производительностью. Выполним данную задачу с помощью метода close() и его синхронного аналога closeSync().

Работа с директориями

Для проверки существующей директории (файла) и доступов к нему в модуле fs применяется метод access

Вторым параметром устанавливается константа режима проверки:

Создание новой папки

Для создания каталогов присутствует асинхронный метод mkdir и синхронный mkdirSync.

Для создания в текущей директории нового каталога, перед путем следует указать переменную __dirname как вариант реализации абсолютного пути, либо воспользоваться метом resolve модуля path.

Чтение содержимого папки

Для получения содержимого директории используются два метода readdir и readdirSync. Первым параметром для методов передается путь директории, содержимое которой нужно получить.

Удаление папки

Удаление директории производится с помощью методов rmdir и rmdirSync. Первым параметром методов является путь удаляемой директории.

Получение системной информации о файле

Каждый файл, который мы загружаем, помимо данных хранит в себе системную информацию. Для получения этой информации можно воспользоваться методом stat() или выбрать синхронный вариант statSync()

Вся информация хранится в получаемом объекте stats. Данный объект хранит в себе методы для получения дополнительной полезной информации.

Перечислю некоторые из этих свойств:

stats.isDirectory() метод позволяет узнать, является ли файл директорией;

stats.isFile() метод возвращает true, если это файл;

stats.isSocket() метод возвращает true, если это сокет;

stats.isSymbolicLink() метод возвращает true, если файл является символьной ссылкой;

stats.size свойство, которое возвращает размер файла;

stats.birthtime возвращает время и дату, когда данный файл был создан.

Модуль path и путь к файлу Node.js

Основной проблемой при работе с файлами и папками в операционных системах является разный синтаксис написания путей их расположения. Для решения этой проблемы в Node.js есть модуль path c набором полезных методов.

Для началы работы с модулем его нужно импортировать.

Получение имени, пути и расширения файла

Предположим, что в папке /temp лежит файл template.txt. Воспользуемся методами модуля path для получения имени файла, пути к нему, а так же его расширения.

Метод basename возвращает наименование файла. Первым параметром передается путь к файлу, вторым параметром (опционально) передается расширение файла, если необходимо получить наименование файла без расширения.

path.basename(file, ‘.txt’) // tempalate

Метод dirname возвращает весь путь директории, где лежит файл и имеет один параметр, в который передается путь к файлу.

Метод extname возвращает расширение переданного файла.

Работа с путями файла

В модуле path есть ряд методов для удобного формирования путей к нужному файлу или директории. Мы не будем рассматривать все методы, а только наиболее часто используемые. Рассмотрим их ниже.

Метод join принимает список параметров, объединяет их в одну строку, используя разделитель, подходящий к конкретной операционной системе, в которой будет исполнятся код.

Метод resolve используется для нахождения абсолютных путей к файлу.

Метод normalize позволяет найти путь к файлу, используя синтаксис переходов (.. и .) по папкам.

Переименование файла или директории

Методы rename() и renameSync() первым параметром принимают путь к файлу, который нужно переименовать. Второй параметр отвечает за новое наименование файла.

Чтение файла

Если вторым параметром не указана кодировка, то возвращается Buffer. Эти методы полностью загружают файлы в память компьютера, что может сильно отразиться на производительности. Если размер файла большой, то стоит воспользоваться потоками fs.createReadStream()

Запись файла

Чтобы перезаписать контент файлов, используются методы writeFile и writeFileSync. Важный момент! Если файла, контент которого нужно перезаписать, не существует, то он будет создан автоматически.

Копирование файла

Методы copyFile() и copyFileSync() первым параметром принимают путь файла для копирования. Второй параметр принимает название пути и нового файла. Третьим параметром является колбэк функция, которая возвращает ошибку.

Удаление файла

Последнее, что мы рассмотрим в этой статье будут методы unlink() и unlinkSync(). Первым параметром методы принимают путь к удаляемому файлу. Второй параметр в методе unlink возвращает колбэк функцию с ошибкой.

Заключение

В данной статье мы разобрали работу Node.js с файлами, на примерах посмотрели основные полезные методы модулей fs и path. Исходный код вы сможете найти тут. Надеюсь данная статья была вам полезна. Учитесь, думайте, пишите код. Удачного кодинга, друзья!

Подписывайтесь на наш канал в Telegram и на YouTube для получения самой последней и актуальной информации.

Читайте также: