Работа с файлами

Последнее обновление: 22.11.2023

Для работы с файлами в 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");
    });
    
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850