Day3

Работа с файловой системой. Модуль fs

Для работы с файлами в Node.js предназначен модуль fs. Рассмотрим, как с ним работать. Для начала подключим модуль:

var fs = require("fs");

Чтение файла

Синтаксис

Ниже приведен синтаксис одного из методов чтения из файла -

fs.read(fd, buffer, offset, length, position, callback)
Этот метод будет использовать файловый дескриптор для чтения файла. Если вы хотите прочитать файл напрямую, используя имя файла, вы должны использовать другой доступный метод. параметры Вот описание используемых параметров - пример Создадим файл js с именем main.js со следующим кодом -
 
var fs = require("fs");
var buf = new Buffer(1024);

console.log("Going to open an existing file");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
      return console.error(err);
   }
   console.log("File opened successfully!");
   console.log("Going to read the file");
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
      if (err){
         console.log(err);
      }
      console.log(bytes + " bytes read");
      
      // Print only read bytes to avoid junk.
      if(bytes > 0){
         console.log(buf.slice(0, bytes).toString());
      }
   });
});

Закрытие файла

Синтаксис

Ниже приведен синтаксис для закрытия открытого файла -

fs.close(fd, callback)
параметры Вот описание используемых параметров -
 
var fs = require("fs");
var buf = new Buffer(1024);

console.log("Going to open an existing file");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
      return console.error(err);
   }
   console.log("File opened successfully!");
   console.log("Going to read the file");
   
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
      if (err){
         console.log(err);
      }

      // Print only read bytes to avoid junk.
      if(bytes > 0){
         console.log(buf.slice(0, bytes).toString());
      }

      // Close the opened file.
      fs.close(fd, function(err){
         if (err){
            console.log(err);
         } 
         console.log("File closed successfully.");
      });
   });
});

Усекать файл

Синтаксис Ниже приведен синтаксис метода обрезания открытого файла -
fs.ftruncate(fd, len, callback)
параметры Вот описание используемых параметров - пример Создадим файл js с именем main.js, имеющий следующий код -
var fs = require("fs");
var buf = new Buffer(1024);

console.log("Going to open an existing file");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
      return console.error(err);
   }
   console.log("File opened successfully!");
   console.log("Going to truncate the file after 10 bytes");
   
   // Truncate the opened file.
   fs.ftruncate(fd, 10, function(err){
      if (err){
         console.log(err);
      } 
      console.log("File truncated successfully.");
      console.log("Going to read the same file"); 
      
      fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
         if (err){
            console.log(err);
         }

         // Print only read bytes to avoid junk.
         if(bytes > 0){
            console.log(buf.slice(0, bytes).toString());
         }

         // Close the opened file.
         fs.close(fd, function(err){
            if (err){
               console.log(err);
            } 
            console.log("File closed successfully.");
         });
      });
   });
});

Чтение из файла

Допустим, в одной папке с файлом приложения app.js расположен текстовый файл hello.txt с простейшим текстом, например:

Hello Node JS!

Для чтения файла в синхронном варианте применяется функция fs.readFileSync():

var fileContent = fs.readFileSync("hello.txt", "utf8");

В метод передается путь к файлу относительно файла приложения app.js, а в качестве второго параметра указывается кодировка для получения текстового содержимого файла. На выходе получаем считанный текст.

Для асинхронного чтения файла применяется функция fs.readFile:

fs.readFile("hello.txt", "utf8", function(error,data){ });

Первый и второй параметр функции опять же соответственно путь к файлу и кодировка. А в качестве третьего параметра передается функция обратного вызова, которая выполняется после завершения чтения. Первый параметр этой функции хранит информацию об ошибке при наличии, а второй - собственно считанные данные.

Для чтения файла определим в файле app.js следующий код:

  var fs = require("fs");
 
// асинхронное чтение
var fs = require('fs');
fs.readFile('test.txt', function(err, data){
  if (err) throw err;
  var text = data.toString();
  console.log(text);
})
 
// синхронное чтение
console.log("Синхронное чтение файла")
var fileContent = fs.readFileSync("hello.txt", "utf8");
console.log(fileContent);

И здесь стоит обратить внимание, что несмотря на то, что функция fs.readFile() вызывается первой, но так как она асинхронная, она не блокирует поток выполнения, поэтому ее результат выводится в самом конце.

Асинхронная функция всегда запускается как метод с callback функцией.

Обратите внимание на метод toString(), который преобразует коды символовов в символы. Так как данные приходят в бинарной кодировке. Также можно преобразовать данные таким способом: var text=''+data.

Задача1

Чтение файла по строкам

Если файл разбит на строки, то удобно иметь возможность его читать по строкам, так, чтобы иметь возможность в дальнейшем этими строками манипулировать. Давайте решим задачу следующего рода, вычитаем файл так, чтобы каждая строка была элементом массива.

var fs = require('fs');
var array = fs.readFile('test.txt',(err, data) => {
  if (err) throw err;
  array = data.toString();
  array = array.split("\n");
  console.log(array);
});

Итак, задача решена.

Задача2

Открытие файла JSON

Если вам необходимо открыть файл JSON, вычитать его и перевести в массив, то используем подобный метод:

  var fs = require('fs');
  fs.readFile('3.json', function(err, data){
    if (err) throw err;
    var text =JSON.parse(data);
    console.log(text);
})
Задача3

Запись в файл

Для записи файла в синхронном варианте используется функция fs.writeFileSync(), которая в качестве параметра принимает путь к файлу и записываемые данные:

fs.writeFileSync("hello.txt", "Привет ми ми ми!")

Также для записи файла можно использовать асинхронную функцию fs.writeFile(), которая принимает те же параметры:

fs.writeFile("hello.txt", "Привет МИГ-29!")

В качестве вспомогательного параметра в функцию может передаваться функция обратного вызова, которая выполняется после завершения записи:

  var fs = require("fs");
 
fs.writeFile("hello.txt", "Hello мир!", function(error){
 
                if(error) throw error; // если возникла ошибка
                console.log("Асинхронная запись файла завершена. Содержимое файла:");
                var data = fs.readFileSync("hello.txt", "utf8");
                console.log(data);  // выводим считанные данные
});

Следует отметить, что эти методы полностью перезаписывают файл. Если надо дозаписать файл, то применяются методы fs.appendFile()/fs.appendFileSync():

var fs = require("fs");
 
fs.appendFileSync("hello.txt", "Привет ми ми ми!");
 
fs.appendFile("hello.txt", "Привет МИД!", function(error){
                if(error) throw error; // если возникла ошибка
                 
                console.log("Запись файла завершена. Содержимое файла:");
                var data = fs.readFileSync("hello.txt", "utf8");
                console.log(data);  // выводим считанные данные
});

Что бы узнать размер файла:

 
const fs = require("fs"); 
const stats = fs.statSync("myfile.txt");
const fileSizeInBytes = stats.size;
//Преобразуем в megabytes
const fileSizeInMegabytes = fileSizeInBytes / 1000000.0

Можно использовать функцию в таком формате:

 
function getFilesizeInBytes(filename) {
    const stats = fs.statSync(filename);
    const fileSizeInBytes = stats.size;
    return fileSizeInBytes
}
Задача4

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

Манипуляции с файловой системой не заканчиваются чтением и записью в файл. Возможности Node.js значительно шире, так мы можем переименовывать файлы и удалять их. Для переименования выполним код:

  var fs = require("fs");
  fs.rename('/tmp/hello.txt', '/tmp/world.txt', function (err) {
  if (err) throw err;
  console.log('renamed complete');
});

Это асинхронный способ переименования, также можно воспользоваться синхронной командой:

  var fs = require("fs");
  fs.renameSync('hello.txt', 'new.txt');

Для удаления файла используем код:

const fs = require('fs');
fs.unlink('file_to_del.txt', (err) => {
  if (err) throw err;
  console.log('successfully deleted /tmp/hello');
});
Задача5

Создание и удаление директории

Для создания директории используем модуль fs со следующим кодом:

  var fs = require('fs');
  fs.mkdir('mmm2/',function(e){
    if(e && e.code === 'EEXIST'){
        //do something with contents
        console.log(e);
    } else {
       console.log('well done');
    }
});

Для удаления директории

  var fs = require('fs');
  fs.rmdir('mmm2',function(e){
    if(e){
        console.log('Error');
    } else {
        console.log('remove');
    }
});

Чтение содержимого каталога

Если необходимо вычитать содержимое каталога, то используем код:

var fs = require('fs');
fs.readdir('.', (err, files) => {
  files.forEach(file => {
    console.log(file);
  });
})
Задача6

Дополнительные материалы