Node.jsМодуль 3: Файловая система
Модуль path
Работа с путями файловой системы
Цель урока
В этом уроке ты научишься:
- Работать с путями кроссплатформенно
- Использовать основные методы path
- Строить пути безопасно
Импорт
const path = require('path');Основные методы
path.join
Объединяет части пути с учетом платформы:
const filePath = path.join('folder', 'subfolder', 'file.txt');
// Windows: folder\subfolder\file.txt
// Linux/Mac: folder/subfolder/file.txt
// С __dirname
const configPath = path.join(__dirname, 'config', 'settings.json');path.resolve
Преобразует в абсолютный путь:
// Относительный -> абсолютный
path.resolve('file.txt');
// /home/user/project/file.txt
// Несколько аргументов
path.resolve('/home', 'user', 'file.txt');
// /home/user/file.txt
// С текущей директорией
path.resolve(__dirname, '..', 'config');
// Родительская директория + configpath.basename
Имя файла:
path.basename('/home/user/file.txt');
// 'file.txt'
// Без расширения
path.basename('/home/user/file.txt', '.txt');
// 'file'path.dirname
Директория:
path.dirname('/home/user/file.txt');
// '/home/user'path.extname
Расширение:
path.extname('file.txt'); // '.txt'
path.extname('file.tar.gz'); // '.gz'
path.extname('file'); // ''Разбор пути
path.parse
const parsed = path.parse('/home/user/file.txt');
console.log(parsed);
// {
// root: '/',
// dir: '/home/user',
// base: 'file.txt',
// ext: '.txt',
// name: 'file'
// }path.format
const filePath = path.format({
dir: '/home/user',
name: 'file',
ext: '.txt'
});
// '/home/user/file.txt'Нормализация
path.normalize
path.normalize('/home/user/../user/./file.txt');
// '/home/user/file.txt'
path.normalize('folder//subfolder///file.txt');
// 'folder/subfolder/file.txt'path.relative
path.relative('/home/user/project', '/home/user/docs');
// '../docs'
path.relative('/a/b/c', '/a/b/c/d/e');
// 'd/e'path.isAbsolute
path.isAbsolute('/home/user'); // true
path.isAbsolute('./file.txt'); // false
path.isAbsolute('file.txt'); // falseПлатформо-зависимые свойства
// Разделитель пути
path.sep; // '/' на Linux/Mac, '\\' на Windows
// Разделитель PATH
path.delimiter; // ':' на Linux/Mac, ';' на Windows
// Принудительно использовать Windows пути
path.win32.join('folder', 'file'); // folder\file
// Принудительно использовать POSIX пути
path.posix.join('folder', 'file'); // folder/fileПрактические примеры
Безопасное построение путей
const path = require('path');
const fs = require('fs/promises');
async function readConfig(filename) {
// Безопасно: предотвращает path traversal
const safeName = path.basename(filename);
const configPath = path.join(__dirname, 'config', safeName);
return fs.readFile(configPath, 'utf8');
}Работа с расширениями
function changeExtension(filePath, newExt) {
const parsed = path.parse(filePath);
return path.format({
...parsed,
base: undefined, // Важно: иначе base перезапишет name+ext
ext: newExt
});
}
changeExtension('file.txt', '.md'); // 'file.md'Получение списка файлов с расширением
const fs = require('fs/promises');
const path = require('path');
async function getFilesByExt(dir, ext) {
const files = await fs.readdir(dir);
return files.filter(file => path.extname(file) === ext);
}
const jsFiles = await getFilesByExt('./src', '.js');Практика
Задание 1: Построение пути
Задача: Построй путь к файлу конфигурации в родительской директории.
Решение:
const configPath = path.join(__dirname, '..', 'config', 'app.json');
// или
const configPath = path.resolve(__dirname, '..', 'config', 'app.json');Задание 2: Замена расширения
Задача: Замени расширение .ts на .js.
Решение:
function tsToJs(filePath) {
const { dir, name } = path.parse(filePath);
return path.join(dir, `${name}.js`);
}
tsToJs('src/app.ts'); // 'src/app.js'Проверь себя
- Чем
path.joinотличается отpath.resolve? - Как получить расширение файла?
- Зачем нужен
path.normalize?