Модуль FS — HackerX https://hackerx.ru Блог о программировании, СУБД, сетях и алгоритмах. Уроки и статьи по разным языкам программирования Wed, 11 Jul 2018 07:15:23 +0000 ru-RU hourly 1 https://wordpress.org/?v=4.9.8 Node.js: Потоки (Stream) и pipe() https://hackerx.ru/node-js-stream-pipe/ https://hackerx.ru/node-js-stream-pipe/#respond Sun, 08 Jul 2018 08:45:41 +0000 https://hackerx.ru/?p=989 Потоковая технология проявляется во всех базовых аспектах Node; она предоставляет функциональность для HTTP, а также для других форм сетевой передачи данных. Кроме того, она предоставляет функциональность для файловой системы. Поток представлен абстрактным интерфейсом, это означает, что вы не будете создавать потоки напрямую. Вместо этого вы будете работать с различными объектами, реализующими интерфейс Stream, — запросами […]

The post Node.js: Потоки (Stream) и pipe() appeared first on HackerX.

]]>
Потоковая технология проявляется во всех базовых аспектах Node; она предоставляет функциональность для HTTP, а также для других форм сетевой передачи данных. Кроме того, она предоставляет функциональность для файловой системы.

Поток представлен абстрактным интерфейсом, это означает, что вы не будете создавать потоки напрямую. Вместо этого вы будете работать с различными объектами, реализующими интерфейс Stream, — запросами HTTP, потоками для чтения или записи модуля File System, объектами сжатия Zlib или process.stdout. Непосредственно реализовать Stream API вам придется только в одном случае: при создании собственной реализации потока.

Так как многие объекты в Node реализуют потоковый интерфейс, все потоки в Node обладают базовой функциональностью:

  • Изменение кодировки потоковых данных вызовом setEncoding.
  • Проверка возможности чтения и (или) записи данных в поток.
  • Перехват событий потоков (например, получения данных или закрытия подключения) с назначением функций обратного вызова для каждого события.
  • Приостановка и возобновление потока.
  • Перенаправление данных из потока для чтения в поток для записи.

Обратите внимание на пункт с проверкой чтения и (или) записи. Поток с поддержкой чтения и записи называется дуплексным. Также существует подвид дуплексных потоков, называемый потоком преобразования данных, в котором ввод и вывод связаны причинной зависимостью. Такая разновидность потоков будет описана позднее, когда я буду рассматривать сжатие Zlib.

Поток для чтения начинает работу в приостановленном состоянии; это означает, что никакие данные не будут отправляться до того момента, пока не будет явно выполнена операция чтения ( stream.read() ) или команда возобновления работы потока ( stream.resume() ). Однако используемые нами реализации потоков, такие как поток для чтения модуля File System, переключаются в рабочий режим сразу же при программировании события данных (механизм получения доступа к данным в потоке для чтения). В рабочем режиме данные передаются приложению сразу же при их появлении.



Потоки для чтения поддерживают несколько событий, но на практике нас обычно интересуют три события: data, end и error. Событие data отправляется при получении нового фрагмента данных, готового к использованию, а событие end — при потреблении всех данных. Событие error, естественно, отправляется при возникновении ошибки. Ниже вы увидите в примерах использование модуля File System.

Поток для записи представляет собой приемник, в который передаются (записываются) данные. Среди прослушиваемых событий можно выделить error и событие finish, происходящее при вызове end() и сбросе всех данных. Также встречается событие drain , генерируемое в тот момент, когда попытка записи данных возвращает false.

Дуплексный поток обладает качествами потоков как для чтения, так и для записи. Поток преобразования данных представляет собой дуплексный поток, в котором — в отличие от обычных дуплексных потоков, где внутренние входные и выходные буферы существуют независимо друг от друга, — эти два буфера связаны напрямую через промежуточный этап преобразования данных. Во внутренней реализации поток преобразования данных должен реализовать функцию _transform(), которая получает входные данные, что-то с ними делает, а затем записывает в вывод.

Чтобы лучше понять суть потока преобразования данных, необходимо поближе познакомиться с функциональностью, поддерживаемой всеми потоками: функцией pipe(). Пример ее использования представлен ниже, где поток для чтения напрямую связывал содержимое файла с объектом ответа HTTP:
Создание и перенаправление потока для чтения

const file = fs.createReadStream(pathname);
file.on("open", function() {
  file.pipe(res);
});

Вызов pipe() извлекает данные из файла (поток) и выводит их в объект http.ServerResponse. В документации Node указано, что этот объект реализует интерфейс потока для записи и, как будет показано позднее, fs.createReadStream() возвращает fs.ReadStream — реализацию потока для чтения. В число методов, поддерживаемых потоком для чтения, входит и pipe() с потоком для записи.

Скоро я добавлю (возможно уже добавил) статью / пример использования модуля Zlib для сжатия файла, а пока ограничимся кратким примером, отлично демонстрирующим применение потока преобразования данных:

const gzip = zlib.createGzip();
const fs   = require('fs');
const inp  = fs.createReadStream('input.txt');
const out  = fs.createWriteStream('input.txt.gz');

inp.pipe(gzip).pipe(out);

На вход поступает поток для чтения, на выходе находится поток для записи. Содержимое одного потока передается в другой, но сначала проходит через процедуру сжатия (это и есть преобразование).

The post Node.js: Потоки (Stream) и pipe() appeared first on HackerX.

]]>
https://hackerx.ru/node-js-stream-pipe/feed/ 0
Синхронное и асинхронное чтение файла в Node.js https://hackerx.ru/fs-readfile-and-fs-readfilesync/ https://hackerx.ru/fs-readfile-and-fs-readfilesync/#respond Sat, 03 Dec 2016 11:08:29 +0000 https://hackerx.ru/?p=336 Для работы с файлами в Node.js нам нужно подключить модуль fs. После подключения модуля, в переменную fs мы получим объект, который имеет все необходимые методы и свойства для работы с файлами. const fs = require("fs"); // Подключаем модуль fs   В этой статье мы узнаем как можно читать файлы в Node.js. В Node.js читать файлы можно двумя способами […]

The post Синхронное и асинхронное чтение файла в Node.js appeared first on HackerX.

]]>
Для работы с файлами в Node.js нам нужно подключить модуль fs. После подключения модуля, в переменную fs мы получим объект, который имеет все необходимые методы и свойства для работы с файлами.

const fs = require("fs");  // Подключаем модуль fs

 

В этой статье мы узнаем как можно читать файлы в Node.js. В Node.js читать файлы можно двумя способами — асинхронный и синхронный.

Асинхронное чтение файла — fs.readFile( )

Метод readFile может принимать 3 аргумента. Из них второй аргумент является обязательным.

fs.readFile(файл[, опции], callback)

  • файл <String> | <Buffer> | <Integer> Имя / адрес файла или файловый дескриптор
  • опции <Object> | <String>
    • кодировка <String> | <Null> по умолчанию = null
    • флаг <String> по умолчанию = ‘r’
  • callback <Function>
  • Первый аргумент — это адрес файла, который нужно читать;
  • Второй аргумент — это опции, который является обязательным. Опции можно указать в виде объекта (для указание нескольких опций) и в виде строки;
  • Третий аргумент — это функция обратного вызова (callback функция). Функция вызывается после чтения файла.

 

Пример чтение файла асинхронно:

const fs = require("fs");

fs.readFile('./test.txt', (err, data) => {
    if (err) throw err;
    console.log(data);
});

В функцию обратного вызова передается два аргумента (err, data). Если при чтение файла возникла ошибка, то в переменную err получим объект с описанием ошибки. А аргумент data содержит содержимое файла.

Если при чтение файла ми не указали кодировку, то данные будут возвращены в виде буфера.

Пример чтение файла с указанием опции:

const fs = require("fs");

fs.readFile('./test.txt', 'utf8', (err, data) => {
    if (err) throw err;
    console.log(data);
});

 

Синхронное чтение файла — fs.readFileSync( )

Многие асинхронные функции в Node.js имеют синхронный вариант. И для чтение файлов в синхронном режиме есть метод readFileSync. Он может принимать 2 аргумента.

fs.readFileSync(файл[, опции])

  • файл <String> | <Buffer> | <Integer> Имя / адрес файла или файловый дескриптор
  • опции <Object> | <String>
    • кодировка <String> | <Null> по умолчанию = null
    • флаг <String> по умолчанию = ‘r’
  • Первый аргумент — это адрес файла, который нужно читать;
  • Второй аргумент — это опции, который является обязательным. Опции можно указать в виде объекта (для указание нескольких опций) и в виде строки;

Пример чтение файла синхронно:

const fs = require("fs");

let data = fs.readFileSync('./test.txt', 'utf8');
console.log(data);

 

The post Синхронное и асинхронное чтение файла в Node.js appeared first on HackerX.

]]>
https://hackerx.ru/fs-readfile-and-fs-readfilesync/feed/ 0
File System — Модуль FS: Работа с файлами в Node.js https://hackerx.ru/modul-fs-rabota-s-faylami-v-node-js/ https://hackerx.ru/modul-fs-rabota-s-faylami-v-node-js/#respond Sun, 22 May 2016 11:41:27 +0000 https://hackerx.ru/?p=309 Для работы с файлами в Node.js необходимо подключить модуль FS (File System). После подключения модуля FS мы в переменную получим объект, который имеет методы для работы с файлами и директориями. Все методы имеют асинхронные и синхронные версии. Асинхронные методы в качестве последнего параметра всегда принимают функцию обратного вызова (callback функцию). Функция обратного вызова принимает одну или несколько параметров. Первый параметр […]

The post File System — Модуль FS: Работа с файлами в Node.js appeared first on HackerX.

]]>
Для работы с файлами в Node.js необходимо подключить модуль FS (File System). После подключения модуля FS мы в переменную получим объект, который имеет методы для работы с файлами и директориями. Все методы имеют асинхронные и синхронные версии.

Асинхронные методы в качестве последнего параметра всегда принимают функцию обратного вызова (callback функцию). Функция обратного вызова принимает одну или несколько параметров. Первый параметр функции практически во всех методах указывается. Если при работе метода возникает ошибка, например, если мы хотим читать файл и адрес файла указан неправильно, то в первом параметре функции обратного вызова будет информация об ошибке, в противном случае в первом параметре будет значения null.

Ниже приведен пример работы асинхронной и синхронной версии.

Асинхронная версия: Удаление файла test.txt из директории tmp с помощью метода unlink().

'use strict';
const fs = require('fs');

fs.unlink('/tmp/test.txt', (err) => {
  if(err) throw err;
  console.log('Файл /tmp/test.txt успешно удален');
});

 Синхронная версия: Удаление файла test.txt из директории tmp с помощью метода unlinkSync().

'use strict';
const fs = require('fs');

fs.unlinkSync('/tmp/test.txt');
console.log('Файл /tmp/test.txt успешно удален');

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

Ниже приведен список методов и классов модуля FS.

  • Buffer API
  • Класс (Class): fs.FSWatcher
    • События (Event): ‘change’
    • События (Event): ‘error’
    • watcher.close()
  • Класс (Class): fs.ReadStream
    • События (Event): ‘open’
    • События (Event): ‘close’
    • readStream.path
  • Класс (Class): fs.Stats
    • Stat Time Values
  • Класс (Class): fs.WriteStream
    • События (Event): ‘open’
    • События (Event): ‘close’
    • writeStream.bytesWritten
    • writeStream.path
  • fs.access(path[, mode], callback)
  • fs.accessSync(path[, mode])
  • fs.appendFile(file, data[, options], callback)
  • fs.appendFileSync(file, data[, options])
  • fs.chmod(path, mode, callback)
  • fs.chmodSync(path, mode)
  • fs.chown(path, uid, gid, callback)
  • fs.chownSync(path, uid, gid)
  • fs.close(fd, callback)
  • fs.closeSync(fd)
  • fs.createReadStream(path[, options])
  • fs.createWriteStream(path[, options])
  • fs.exists(path, callback)
  • fs.existsSync(path)
  • fs.fchmod(fd, mode, callback)
  • fs.fchmodSync(fd, mode)
  • fs.fchown(fd, uid, gid, callback)
  • fs.fchownSync(fd, uid, gid)
  • fs.fdatasync(fd, callback)
  • fs.fdatasyncSync(fd)
  • fs.fstat(fd, callback)
  • fs.fstatSync(fd)
  • fs.fsync(fd, callback)
  • fs.fsyncSync(fd)
  • fs.ftruncate(fd, len, callback)
  • fs.ftruncateSync(fd, len)
  • fs.futimes(fd, atime, mtime, callback)
  • fs.futimesSync(fd, atime, mtime)
  • fs.lchmod(path, mode, callback)
  • fs.lchmodSync(path, mode)
  • fs.lchown(path, uid, gid, callback)
  • fs.lchownSync(path, uid, gid)
  • fs.link(srcpath, dstpath, callback)
  • fs.linkSync(srcpath, dstpath)
  • fs.lstat(path, callback)
  • fs.lstatSync(path)
  • fs.mkdir(path[, mode], callback)
  • fs.mkdirSync(path[, mode])
  • fs.mkdtemp(prefix, callback)
  • fs.mkdtempSync(template)
  • fs.open(path, flags[, mode], callback)
  • fs.openSync(path, flags[, mode])
  • fs.read(fd, buffer, offset, length, position, callback)
  • fs.readdir(path[, options], callback)
  • fs.readdirSync(path[, options])
  • fs.readFile(file[, options], callback)
  • fs.readFileSync(file[, options])
  • fs.readlink(path[, options], callback)
  • fs.readlinkSync(path[, options])
  • fs.readSync(fd, buffer, offset, length, position)
  • fs.realpath(path[, options], callback)
  • fs.realpathSync(path[, options])
  • fs.rename(oldPath, newPath, callback)
  • fs.renameSync(oldPath, newPath)
  • fs.rmdir(path, callback)
  • fs.rmdirSync(path)
  • fs.stat(path, callback)
  • fs.statSync(path)
  • fs.symlink(target, path[, type], callback)
  • fs.symlinkSync(target, path[, type])
  • fs.truncate(path, len, callback)
  • fs.truncateSync(path, len)
  • fs.unlink(path, callback)
  • fs.unlinkSync(path)
  • fs.unwatchFile(filename[, listener])
  • fs.utimes(path, atime, mtime, callback)
  • fs.utimesSync(path, atime, mtime)
  • fs.watch(filename[, options][, listener])
    • Caveats
      • Availability
      • Inodes
      • Filename Argument
  • fs.watchFile(filename[, options], listener)
  • fs.write(fd, buffer, offset, length[, position], callback)
  • fs.write(fd, data[, position[, encoding]], callback)
  • fs.writeFile(file, data[, options], callback)
  • fs.writeFileSync(file, data[, options])
  • fs.writeSync(fd, buffer, offset, length[, position])
  • fs.writeSync(fd, data[, position[, encoding]])

The post File System — Модуль FS: Работа с файлами в Node.js appeared first on HackerX.

]]>
https://hackerx.ru/modul-fs-rabota-s-faylami-v-node-js/feed/ 0