[Перевод] Node.js для начинающих: основы работы с файлами

Сегодня мы поговорим о том, как работать с файловой системой средствами Node.js, рассмотрим базовые операции, выполняемые с файлами. К таким операциям относятся следующие:

  • Создание файла
  • Чтение файла
  • Запись данных в файл
  • Удаление файла
  • Переименование файла


Необходимость в выполнении подобных операций возникает в самых разных ситуациях.

8zrf2cspu175s6tvwsqmj7l3cii.jpeg

Модуль 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() может принимать различные флаги. Вот некоторые из них:

  1. r: открыть файл для чтения
  2. r+: открыть файл для чтения и записи
  3. rs: открыть файл для чтения в синхронном режиме
  4. w: открыть файл для записи
  5. a: открыть файл для записи данных в конец файла
  6. 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] ---------');

    });

}


Вот что у нас получится.

f7d09e7f491862b46eb0c0f02e671874.png


Данные файла, выведенные в консоль

Теперь поговорим о переименовании файлов.

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


Для переименования файлов используется метод .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 или что-то другое?

1ba550d25e8846ce8805de564da6aa63.png

© Habrahabr.ru