Для работы с файлами в Node.js предназначен модуль fs. Рассмотрим, как с ним работать. Для начала подключим модуль:
var fs = require("fs");
Ниже приведен синтаксис одного из методов чтения из файла -
fs.read(fd, buffer, offset, length, position, 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);
}
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)параметры Вот описание используемых параметров -
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, вычитать его и перевести в массив, то используем подобный метод:
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