Для работы с файлами в Node.js предназначен модуль fs. Рассмотрим, как с ним работать.
Для асинхронного чтения файла применяется функция fs.readFile:
fs.readFile(path[, options], callback)
Функция принимает до трех параметров:
path
: путь к файлу
options
: необязательный параметр, который представляет дополнительные параметры считывания, в частности, кодировку
callback
: функция обратного вызова, которая выполняется после завершения чтения.
callback(error, data){}
Первый параметр этой функции хранит информацию об ошибке (если чтение закончилось ошибкой), а второй - собственно считанные данные
Допустим, в папке проекта расположен текстовый файл hello.txt со следующим текстом:
Hello METANIT.COM! Hello World!
Для чтения файла "hello.txt" определим в папке проекта файл app.js со следующим кодом:
const fs = require("fs"); fs.readFile("hello.txt", function(error,data){ if(error) { // если возникла ошибка return console.log(error); } console.log(data.toString()); // выводим считанные данные }); console.log("Асинхронное чтение файлов");
И здесь стоит обратить внимание, что несмотря на то, что функция fs.readFile()
вызывается первой, но так как она асинхронная, она не блокирует
поток выполнения, поэтому ее результат выводится в самом конце.
c:\app> node app.js Асинхронное чтение файлов Hello METANIT.COM! Hello World! c:\app>
Для чтения файла в синхронном варианте применяется функция fs.readFileSync():
fs.readFileSync(path[, options])
В метод передается путь к файлу, а в качестве второго параметра можно дополнительно указать кодировку. В качестве результат функция возвращает считанные данные. Пример применения:
const fs = require("fs"); const data = fs.readFileSync("hello.txt"); console.log(data.toString()); // выводим считанные данные console.log("Синхронное чтение файлов");
Консольный вывод программы:
c:\app> node app.js Hello METANIT.COM! Hello World! Синхронное чтение файлов c:\app>
Для асинхронной записи файла применяется функция fs.writeFile(), которая принимает 4 параметра:
fs.writeFile(file, data[, options], callback)
Параметры функции:
file
: путь к файлу
data
: записываемые данные
options
: дополнительный конфигурационный объект, который определяет следующие свойства:
encoding
: кодировка, которая используется при записи. Значение по умолчанию - "utf8"
mode
: Режим записи в виде числа. Значение по умолчанию - 0o666
flag
: один из системных флагов открытия файла. Значение по умолчанию - "w" (открытие на запись).
flush
: булевое свойство, которое указывает, надо ли данные сразу записывать файл. Значение по умолчанию - false.
signal
: объект AbortSignal, который позволяет прекратить запись
callback
: функция, которая вызывается после записи файла. Если запись закончилась ошибкой, то первый параметр функции содержит информацию об ошибке
Пример записи файла:
const fs = require("fs"); const data = "Hello Node.js\n"; fs.writeFile("hello2.txt", data, function(error){ if(error){ // если ошибка return console.log(error); } console.log("Файл успешно записан"); });
Для записи файла в синхронном варианте используется функция fs.writeFileSync(), которая в качестве параметра принимает путь к файлу и записываемые данные:
fs.writeFileSync("hello2.txt", "Hello Work...\n")
Следует отметить, что эти методы по умолчанию полностью перезаписывают файл. Если надо дозаписать файл, то применяются методы fs.appendFile()/fs.appendFileSync()^ которые принимают те же параметры:
const fs = require("fs"); // синхронное добавление fs.appendFileSync("hello2.txt", "Hello word\n"); // асинхронное добавление fs.appendFile("hello2.txt", "Hello walk\n", function(error){ if(error) return console.log(error); // если возникла ошибка console.log("Запись файла завершена"); });
В качестве альтернативы можно установить через объект конфигурации флаг на дозапись - флаг "a":
fs.writeFile("hello2.txt", "Hello all\n", {flag:"a"}, function(error){ if(error) return console.log(error); // если возникла ошибка console.log("Запись файла завершена"); });
Для получения информации о файле в асинхронном режиме применяется функция stat():
fs.stat(path[, options], callback)
Первый параметр представляет путь к файлу. Второй, необязательный параметр представляет объект, у которого свойство bigint
хранит логическое значение и
указывает, надо ли возвратить данные в виде числа (при значении true). Третий параметр - функция обратного вызова, которая принимает два параметра:
callback(error, stat){}
Первый параметр хранит информацию об ошибке (при ее наличии), а второй - статистику файла. Например, получим статистику файла:
const fs = require("fs"); // асинхронное добавление fs.stat("hello.txt", (error, stats) => { if (error) return console.error(error); console.log(stats.isFile()); // true console.log(stats.isDirectory()); // false console.log(stats); });
Полученная статистика представляет сложный объект с кучей свойств, которые можно увидеть по выводу. Например, я получу следующий вывод:
c:\app> node app.js true false Stats { dev: 16777220, mode: 33188, nlink: 1, uid: 501, gid: 20, rdev: 0, blksize: 4096, ino: 8648323536, size: 31, blocks: 8, atimeMs: 1700671481153.5369, mtimeMs: 1700667050455.9146, ctimeMs: 1700667050455.9146, birthtimeMs: 1643908248703.2, atime: 2023-11-22T16:44:41.154Z, mtime: 2023-11-22T15:30:50.456Z, ctime: 2023-11-22T15:30:50.456Z, birthtime: 2022-02-03T17:10:48.703Z } c:\app>
Для синхронного получения статистики применяется метод statSync(), который получает путь к файлу и возвращает объект статистики:
const fs = require("fs"); const stats = fs.statSync("hello2.txt") console.log(stats.isFile()); // true console.log(stats.isDirectory()); // false console.log(stats);
Для удаления файла в синхронном варианте используется функция fs.unlinkSync(), которая в качестве параметра принимает путь к удаляемому файлу:
fs.unlinkSync("hello.txt")
Также для удаления файла можно использовать асинхронную функцию fs.unlink(), которая принимает путь к файлу и функцию, вызываемую при завершении удаления:
fs.unlink("hello.txt", (error) => { if (error) return console.log(error); // если возникла ошибка console.log("File deleted"); });
Также для работы с каталогами Node.js предоставляет ряд функций.
Для создания каталога применяется функции mkdir() (асинхронная) и mkdirSync() (синхронная). В качестве параметра они принимают название каталога. Асинхронный вариант в качестве второго параметра принимает функцию обратного вызова, которая срабатывает при создании каталога:
const fs = require("fs"); fs.mkdir("test", (error) => { if (error) return console.log(error); console.log("Folder created"); });
Для считывания файлов из каталога применются функции readdir() (асинхронная) и readdirSync() (синхронная). В качестве параметра они принимают название каталога. Асинхронный вариант в качестве второго параметра принимает функцию обратного вызова, у которой второй параметр представляет список файлов и папок каталога:
const fs = require("fs"); fs.readdir("test", (error, files) => { if (error) return console.log(error); files.forEach((file) => console.log(file)); });
Для удаления каталога применяются функции rmdir() (асинхронная) и rmdirSync(). В качестве параметра они принимают название каталога. Асинхронный вариант в качестве второго параметра принимает функцию обратного вызова, которая срабатывает при удалении каталога:
const fs = require("fs"); fs.rmdir("test", (error) => { if (error) return console.log(error); console.log("Folder deleted"); });