JS Tower
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');
// Родительская директория + config

path.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'

Проверь себя

  1. Чем path.join отличается от path.resolve?
  2. Как получить расширение файла?
  3. Зачем нужен path.normalize?