Файлы¶
Для работы с файлами в 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()
, но сейчас он уже официально устарел и не поддерживается.