Файлы¶
Для работы с файлами в Node.js используется встроенный модуль fs, который выполняет все синхронные и асинхронные операции ввода/вывода применительно к файлам. Чтение и запись файла могут осуществляться одним из двух способов:
- с использованием
Buffer; - через создание соответствующего потока.
Чтение файлов и директорий¶
Для чтения файла в асинхронном режиме используется метод Node.js readFile(), который принимает три параметра:
- путь к файлу;
- кодировка;
- callback-функция, вызываемая после получения содержимого файла.
1 2 3 4 5 | |
Callback-функции передается два аргумента: ошибка и полученные данные в строковом формате. Если операция прошла успешна, то в качестве ошибки передается null.
Если в readFile() не указать кодировку, то данные файла будут возвращены в формате Buffer.
Поскольку метод выполняется асинхронно, то не происходит блокировки главного процесса Node.js. Но в некоторых случаях может понадобиться синхронное чтение файла, для этого есть метод readFileSync(), но при этом выполнение главного процесса будет заблокировано до тех пор, пока полностью не будет загружено содержимое файла.
1 2 | |
Node.js readFileSync() возвращает результат чтения файла и принимает два параметра:
- путь к файлу;
- кодировку.
Обработка и перехват ошибок при использовании readFileSync() осуществляется с помощью конструкции try{...}catch(){...}.
1 2 3 4 5 6 7 8 9 | |
Чтобы инициировать ошибку, укажите неправильный путь к файлу.
Методы readFile() и readFileSync() для работы с файлами используют Buffer. Но есть и другой способ считать содержимое файла: создать поток с помощью Node.js fs.createReadStream(). Любой поток в Node.js является экземпляром класса EventEmitter, который позволяет обрабатывать возникающие в потоке события.
Параметры, принимаемые fs.createReadStream():
- путь к файлу;
- объект со следующими настройками:
encoding- кодировка (по умолчаниюutf8);mode- режим доступа (по умолчанию0o666);autoClose- еслиtrue, то при событияхerrorиfinishпоток закроется автоматически (по умолчаниюtrue).
1 2 3 4 5 6 | |
Вместо объекта настроек можно передать строку, которая будет задавать кодировку.
Использование потока имеет ряд преимуществ перед Buffer:
- Меньшее использование памяти за счет чтения содержимого по частям;
- Для объемных файлов время между запросом и ответом существенно сокращается за счет того, что данные начинают поступать по частям, а не после полной загрузки;
- Возможность перенаправить данные в другой поток с помощью метода
pipe().
Для чтения директорий используются методы readdir() и readdirSync(), для асинхронного и синхронного режимов соответственно.
Node.js readdir() работает асинхронно и принимает три аргумента:
- путь к директории;
- кодировку;
- callback-функцию, которая принимает аргументами ошибку и массив файлов директории (при успешном выполнении операции ошибка передается как
null).
1 2 3 4 5 | |
Node.js readdirSync() работает синхронно, возвращает массив найденных файлов и принимает два параметра:
- путь к директории;
- кодировку.
1 2 3 4 5 6 | |
Создание и запись файлов и директорий¶
В Node.js файлы могут быть записаны также синхронно и асинхронно. Для асинхронной записи имеется метод writeFile(), принимающий следующие аргументы:
- путь к файлу;
- данные для записи;
- параметры записи:
- кодировка (по умолчанию
utf8); - права доступа (по умолчанию
0o666);
- кодировка (по умолчанию
- callback-функция, которая вызывается по завершению операции и единственным аргументом принимает ошибку (в случае успешной записи передается
null).
1 2 3 4 5 6 7 8 9 10 | |
Если нет необходимости указывать параметры записи, то третьим параметром Node.js writeFile() можно сразу передать callback-функцию.
Для синхронной записи Node.js файла используйте writeFileSync(). Метод принимает все те же аргументы, что и writeFile() за исключением callback-функции. В качестве значения возвращает undefined.
1 2 3 4 5 6 7 8 9 10 | |
Как и в случае с readFileSync() обработка ошибок происходит с помощью try{...}catch(){...}.
Методы writeFile() и writeFileSync() перезаписывают уже имеющуюся в файле информацию новыми данными. Если вам нужно внести новые данные без удаления старых, используйте методы appendFile() и appendFileSync(), которые имеют идентичные параметры.
1 2 3 4 5 6 7 8 9 10 | |
Для записи файла через поток ввода имеется метод fs.createWriteStream(), который возвращает поток ввода и принимает два параметра:
- путь к файлу;
- объект со следующими настройками:
encoding- кодировка (по умолчаниюutf8);mode- режим доступа (по умолчанию0o666);autoClose- еслиtrue, то при событияхerrorиfinishпоток закроется автоматически (по умолчаниюtrue).
1 2 3 4 5 6 7 8 9 10 11 | |
Чтобы создать директорию, используйте методы mkdir() и mkdirSync().
Node.js mkdir() работает асинхронно и принимает в качестве параметров:
- путь к директории;
- объект со следующими настройками:
recursive- еслиtrue, создает директорию и все ее родительские директории согласно указанному пути, если они еще не существуют (по умолчаниюfalse, т. е. все родительские директории уже должны быть созданы, иначе будет сгенерирована ошибка);mode- режим доступа, параметр не поддерживается на ОС Windows (по умолчанию0o777);- callback-функцию, которая единственным аргументом принимает ошибку, при успешном создании директории передается
null.
Вторым параметром можно сразу передать callback-функцию.
1 2 3 4 5 | |
Node.js mkdirSync() создает директорию синхронно и возвращает undefined. Обработка ошибок осуществляется через try{...}catch(){...}. Метод mkdirSync() принимает те же параметры, что и mkdir(), за исключением callback-функции.
1 2 3 4 5 6 | |
Удаление файлов и директорий¶
Чтобы удалить в Node.js файлы используйте методы unlink() и unlinkSync().
Метод unlink() асинхронный и принимает имя файла, который нужно удалить, и callback-функцию с ошибкой в качестве параметра (null, если удаление прошло успешно).
1 2 3 4 5 | |
Для синхронного удаления файла используйте unlinkSync(), которому единственным аргументом передается имя файла.
1 2 3 4 5 6 | |
Для удаления директорий имеются методы rmdir() и rmdirSync() соответственно. Они полностью идентичны unlink() и unlinkSync(), только вместо имени файла принимают имя директории.
Пример rmdir().
1 2 3 4 5 | |
Пример rmdirSync().
1 2 3 4 5 6 | |
existsSync()¶
Проверка наличия в Node.js файла или директории происходит с помощью метода existsSync(), который принимает путь к файлу или директории и возвращает либо true, либо false. Как вы понимаете, Node.Js existsSync() работает в синхронном режиме.
1 2 3 4 5 6 | |
Раньше был и Node.js exists(), но сейчас он уже официально устарел и не поддерживается.