Node.js - Система файлов
Добро пожаловать, будущие программисты! Сегодня мы погружаемся в захватывающий мир Node.js и его модуль Система файлов. Как ваш доброжелательный соседский компьютерный учитель, я здесь, чтобы провести вас через это путешествие с множеством примеров и объяснений. Так что пристегнитесь и давайте начнем!
Синхронные и асинхронные операции
Прежде чем мы перейдем к конкретике файловых операций, давайте поговорим о двух важных концепциях: синхронных и асинхронных операциях.
Представьте, что вы находитесь в кофейне. В синхронном мире вы заказываете кофе, ждете, пока его приготовят, а затем переходите к следующему заданию. В асинхронном мире вы заказываете кофе и продолжаете заниматься своими делами, пока бариста его готовит.
В 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