Node.js - Система файлов

Добро пожаловать, будущие программисты! Сегодня мы погружаемся в захватывающий мир Node.js и его модуль Система файлов. Как ваш доброжелательный соседский компьютерный учитель, я здесь, чтобы провести вас через это путешествие с множеством примеров и объяснений. Так что пристегнитесь и давайте начнем!

Node.js - File System

Синхронные и асинхронные операции

Прежде чем мы перейдем к конкретике файловых операций, давайте поговорим о двух важных концепциях: синхронных и асинхронных операциях.

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

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

const fs = require('fs');

// Синхронное чтение
const data = fs.readFileSync('hello.txt', 'utf8');
console.log(data);

// Асинхронное чтение
fs.readFile('hello.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});

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

Запись в файл

Теперь давайте научимся записывать в файл. Это как оставлять записку для своего будущего "я"!

const fs = require('fs');

// Синхронная запись
fs.writeFileSync('note.txt', 'Привет, Будущему мне!');

// Асинхронная запись
fs.writeFile('note.txt', 'Привет, Будущему мне!', (err) => {
if (err) throw err;
console.log('Файл сохранен!');
});

В обоих случаях мы создаем (или перезаписываем) файл 'note.txt' с содержимым "Привет, Будущему мне!". Асинхронная версия включает callback-функцию, которая запускается после записи файла.

Чтение файла

Чтение файла похоже на открытие той записки, которую вы оставили для себя. Давайте посмотрим, как это делается:

const fs = require('fs');

// Синхронное чтение
const data = fs.readFileSync('note.txt', 'utf8');
console.log(data);

// Асинхронное чтение
fs.readFile('note.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});

Оба метода будут выводить содержимое 'note.txt'. Параметр 'utf8' specifies the encoding of the file.

Открывать файл

Иногда мы хотим получить больше контроля над тем, как мы взаимодействуем с файлом. Тогда comes in метод open:

const fs = require('fs');

// Асинхронное открытие
fs.open('myfile.txt', 'r', (err, fd) => {
if (err) throw err;
console.log('Файл успешно открыт!');
// Не забудьте закрыть файл, когда закончите
fs.close(fd, (err) => {
if (err) throw err;
});
});

Это открывает 'myfile.txt' в режиме чтения ('r'). fd в callback - это дескриптор файла, который мы будем использовать для дальнейших операций с файлом.

API с Promise

Для тех, кто предпочитает работать с Promise (не волнуйтесь, если вы еще не знаете, что это такое!), Node.js предоставляет API на основе Promise для файловых операций:

const fs = require('fs').promises;

async function readMyFile() {
try {
const data = await fs.readFile('myfile.txt', 'utf8');
console.log(data);
} catch (error) {
console.error('Ошибка чтения файла:', error);
}
}

readMyFile();

Этот код достигает того же результата, что и наш предыдущий асинхронный пример readFile, но использует современный синтаксис JavaScript.

Получение информации о файле

Интересуетесь статистикой файла? Node.js все это предоставляет:

const fs = require('fs');

fs.stat('myfile.txt', (err, stats) => {
if (err) throw err;
console.log(`Размер файла: ${stats.size} байтов`);
console.log(`Это каталог? ${stats.isDirectory()}`);
console.log(`Это файл? ${stats.isFile()}`);
});

Это предоставляет нам информацию, такую как размер файла, является ли он каталогом или файлом и многое другое.

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

Всегда закрывайте файлы, когда закончите с ними. Это как закрыть крышку на вашей зубной пасте!

const fs = require('fs');

fs.open('myfile.txt', 'r', (err, fd) => {
if (err) throw err;
// Выполните некоторые операции...
fs.close(fd, (err) => {
if (err) throw err;
console.log('Файл успешно закрыт');
});
});

Урезать файл

Иногда вы хотите оставить файл, но удалить его содержимое. Тогда comes in метод truncate:

const fs = require('fs');

fs.truncate('myfile.txt', 0, (err) => {
if (err) throw err;
console.log('Содержимое файла очищено!');
});

Это уменьшает файл до 0 байтов, эффективно очищая его содержимое.

Удаление файла

Когда вы полностью закончили с файлом, вы можете его удалить:

const fs = require('fs');

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

Будьте осторожны с этим - в реальной жизни нет кнопки "отменить"!

Создание каталога

Нужен новый каталог? Вот как его создать:

const fs = require('fs');

fs.mkdir('mynewfolder', (err) => {
if (err) throw err;
console.log('Каталог успешно создан!');
});

Чтение каталога

Хотите увидеть, что находится в каталоге? Вот как это делается:

const fs = require('fs');

fs.readdir('.', (err, files) => {
if (err) throw err;
console.log('Содержимое каталога:');
files.forEach(file => {
console.log(file);
});
});

Это перечисляет все файлы и подкаталоги в текущем каталоге.

Удаление каталога

И finally, если вы хотите удалить каталог:

const fs = require('fs');

fs.rmdir('mynewfolder', (err) => {
if (err) throw err;
console.log('Каталог успешно удален');
});

Заметим, что это работает только для пустых каталогов.

Справочник методов

Вот удобная таблица методов, которые мы рассмотрели:

Метод Описание
readFile Читает全部 содержимое файла
writeFile Записывает данные в файл, заменяя файл, если он уже существует
open Открывает файл для чтения или записи
close Закрывает дескриптор файла
stat Получает информацию о файле
truncate Укорачивает файл до определенной длины
unlink Удаляет файл
mkdir Создает новый каталог
readdir Читает содержимое каталога
rmdir Удаляет каталог

И вот и все! Теперь вы equipped с основами файловых операций в Node.js. Помните, что практика делает perfect, так что не бойтесь экспериментировать с этими методами. Счастливого кодирования!

Credits: Image by storyset