Сегодня мы поговорим о том, как работать с файловой системой средствами Node.js, рассмотрим базовые операции, выполняемые с файлами. К таким операциям относятся следующие:
- Создание файла
- Чтение файла
- Запись данных в файл
- Удаление файла
- Переименование файла
Необходимость в выполнении подобных операций возникает в самых разных ситуациях.
Модуль fs
В Node.js имеется стандартный модуль, fs
(сокращение от File System), дающий разработчику средства для работы с файловой системой. Импортировать его в проект можно так:
var fs = require(‘fs’);
Методы этого модуля представлены в синхронной и асинхронной формах. Функции обратного вызова, передаваемые асинхронным методам, принимают в качестве первого параметра объект ошибки, а в качестве второго — данные, возвращённые при успешном выполнении операции. Рассмотрим пример:
function fileHandler(){
fs.readFile('textFile.txt', 'utf8', (err, data) => {
if(err) throw err;
console.log(data);
});
}
Метод .readFile()
, о котором мы ещё поговорим, предназначен для чтения файлов. В этом примере у функции обратного вызова есть два параметра — err
и data
. В первый параметр попадают ошибки, которые могут возникнуть при попытке чтения файла, во втором оказываются данные, полученные после успешного выполнения операции. Обратите внимание на то, что .readFile()
— это асинхронный метод модуля fs
. Его синхронная версия называется .readFileSync()
. Похожий подход используется и для именования других методов модуля.
Создание нового файла
Начнём с примера:
function fileHandler(){
fs.open('testFile.txt', 'w', (err) => {
if(err) throw err;
console.log('File created');
});
}
Здесь метод fs.open()
используется для создания нового файла. В качестве первого аргумента он принимает имя файла. Его второй аргумент представляет собой флаг, указывающий системе на то, что именно мы хотим сделать с файлом. В данном случае это флаг w
(сокращение от writing), который указывает на то, что мы хотим открыть файл для записи. Метод .open()
может принимать различные флаги. Вот некоторые из них:
r
: открыть файл для чтенияr+
: открыть файл для чтения и записиrs
: открыть файл для чтения в синхронном режимеw
: открыть файл для записиa
: открыть файл для записи данных в конец файлаa+
: открыть файл для чтения и для записи данных в конец файла
Теперь, прежде чем переходить к следующему примеру, отредактируем только что созданный файл testFile.txt
с помощью какого-нибудь текстового редактора. Внесём в него следующий текст:
This is a test file.
We're learning about Node.js File System.
The End.
Запись данных в файл
Поговорим о том, как дописать что-нибудь в файл:
function fileHandler(){
fs.appendFile('testFile.txt', ' This line is beyond the end.', (err) => {
if(err) throw err;
console.log('Data has been added!');
});
}
Здесь мы используем метод .appendFile()
для добавления данных в конец существующего файла. В качестве первого аргумента этот метод принимает имя файла, в качестве второго — данные, которые нужно добавить в конец файла. Третий аргумент — это, как обычно, функция обратного вызова.
После того, как код, показанный выше, успешно отработает, содержимое файла будет выглядеть так:
This is a test file.
We're learning about Node.js File System.
The End. This line is beyond the end.
Существует и другой способ записи данных в файл. Он подразумевает использование метода .writeFile()
. Этот метод очень похож на .appendFile()
, но у него есть одно важное отличие. Дело в том, что с помощью метода .appendFile()
мы добавляем в файл новые данные после тех данных, которые в нём уже есть. А при использовании метода .writeFile()
содержимое файла заменяется на новое. Испытаем этот метод:
function fileHandler(){
fs.writeFile('testFile.txt', "I'm the replacement you've been looking for.", (err) => {
if(err) throw err;
console.log('Data has been replaced!');
});
}
После успешного выполнения операции в файле окажется следующий текст:
I'm the replacement you've been looking for.
Как видно, содержимое файла полностью заменено новым.
Чтение файла
Для чтения файлов модуль fs
предоставляет метод .readFile()
, пример использования которого мы уже видели. В качестве первого параметра он принимает имя файла, в качестве второго — кодировку. Третий параметр — функция обратного вызова. Попытаемся вывести в консоль содержимое файла testFile.txt
с помощью этого метода:
function fileHandler(){
fs.readFile('testFile.txt', 'utf8', (err, data) => {
if(err) throw err;
console.log('--------- [File Data] ---------');
console.log(data);
console.log('--------- [File Data] ---------');
});
}
Вот что у нас получится.
Данные файла, выведенные в консоль
Теперь поговорим о переименовании файлов.
Переименование файла
Для переименования файлов используется метод .rename()
:
function fileHandler(){
fs.rename('testFile.txt', 'newTestFile.txt', (err) => {
if(err) throw err;
console.log('File renamed successfully!');
});
}
Первый аргумент метода представляет собой имя существующего файла, второй — новое имя этого файла. После успешного вызова этого метода файл testFile.txt
превращается в newTestFile.txt
.
Удаление файла
Для удаления файлов используется метод .unlink()
:
function fileHandler(){
fs.unlink('newTestFile.txt', (err) => {
if(err) throw err;
console.log('File deleted successfully!');
});
}
Успешный вызов этого метода приводит к удалению файла newTestFile.txt
.
Итоги
В этом материале мы рассмотрели основы работы с файловой системой в среде Node.js. Если вы хотите более глубоко освоить эту тему — взгляните на этот материал из цикла публикаций по Node.js, почитайте документацию по модулю fs
и постарайтесь испробовать на практике всё, о чём узнаете.
Уважаемые читатели! Используете ли вы для работы с файлами в Node.js стандартный модуль fs или что-то другое?
Автор: ru_vds