JavaRush /Курсы /Модуль 4: Node.js, Next.js и Angular /Удаление файлов: fs.unlink...

Удаление файлов: fs.unlink, fs.unlinkSync

Модуль 4: Node.js, Next.js и Angular
3 уровень , 3 лекция
Открыта

1. Введение

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

Удаление файлов вручную — это как чистить папку "Загрузки" раз в год: долго, скучно и всегда что-то важное случайно удалишь. Программное удаление позволяет автоматизировать этот процесс и не заставлять пользователя лазить по файловой системе.

Node.js предоставляет два основных метода для удаления файлов:

  • fs.unlink(path, callback) — асинхронный способ (рекомендуется для большинства случаев)
  • fs.unlinkSync(path) — синхронный способ (используйте только если уверены, что это безопасно)

Оба метода удаляют файл по указанному пути. Если файла нет — будет ошибка.

Документация на пальцах

  • fs.unlink — "удалить файл, не блокируя основной поток". Использует колбэк для обработки результата.
  • fs.unlinkSync — "удалить файл и ждать, пока операция завершится". Если что-то пойдёт не так — бросит исключение.

2. fs.unlink: асинхронное удаление файла

Асинхронный способ — это когда вы говорите Node.js: "Сделай дело, а когда закончишь — позови меня". Программа не замирает, а продолжает работать.

Синтаксис

fs.unlink(path, callback)
  • path — строка с путём к файлу.
  • callback — функция, которая будет вызвана после удаления. Первый аргумент — ошибка (если что-то пошло не так), иначе null.

Пример: удаляем файл заметки

const fs = require('fs');

fs.unlink('note.txt', (err) => {
  if (err) {
    console.error('Ошибка при удалении файла:', err.message);
    return;
  }
  console.log('Файл успешно удалён!');
});

Как это работает?

  • Node.js начинает удалять файл.
  • Если всё прошло хорошо — вызывается колбэк без ошибки, и мы видим сообщение об успехе.
  • Если файла не было, или нет прав на удаление — в err будет объект ошибки, и мы увидим сообщение об ошибке.

Встраиваем в наше приложение

Если вы делаете менеджер задач, то при удалении задачи вызывайте fs.unlink для соответствующего файла.

function deleteTask(taskId) {
  const filePath = `tasks/${taskId}.json`;
  fs.unlink(filePath, (err) => {
    if (err) {
      console.error('Не удалось удалить задачу:', err.message);
      return;
    }
    console.log('Задача удалена!');
  });
}

3. fs.unlinkSync: синхронное удаление файла

Синхронный способ — это когда программа ждёт, пока файл удалится, и только потом делает что-то дальше. Это удобно для скриптов, которые работают быстро и не обрабатывают сотни файлов одновременно.

Синтаксис

fs.unlinkSync(path)
  • path — строка с путём к файлу.
  • Если что-то пошло не так (например, файла нет) — будет выброшено исключение.

Пример: удаляем файл синхронно

const fs = require('fs');

try {
  fs.unlinkSync('note.txt');
  console.log('Файл удалён синхронно!');
} catch (err) {
  console.error('Ошибка при удалении файла:', err.message);
}

Как это работает?

  • Если файл удалён — программа идёт дальше.
  • Если возникла ошибка — мы ловим её в блоке catch и выводим сообщение.

Когда использовать unlinkSync?

  • В маленьких утилитах, где нет длительных операций и не нужен отклик в реальном времени.
  • В скриптах, которые работают только с одним-двумя файлами.
  • Не используйте в серверных приложениях — это может "заморозить" весь сервер на время операции.

4. Что происходит, если файла нет?

Если вы попытаетесь удалить несуществующий файл, получите ошибку вида:

  • Для fs.unlink: ошибка в первом аргументе колбэка.
  • Для fs.unlinkSync: выбрасывается исключение.
fs.unlink('abracadabra.txt', (err) => {
  if (err) {
    // err.code будет 'ENOENT'
    console.error('Файл не найден:', err.message);
  }
});

5. Удаление нескольких файлов: цикл и обработка ошибок

Допустим, у вас есть массив файлов, которые надо удалить. Как это сделать?

Асинхронно (рекомендуется)

const files = ['a.txt', 'b.txt', 'c.txt'];

files.forEach((file) => {
  fs.unlink(file, (err) => {
    if (err) {
      console.error(`Ошибка при удалении ${file}:`, err.message);
    } else {
      console.log(`${file} удалён!`);
    }
  });
});

Синхронно (если очень надо)

const files = ['a.txt', 'b.txt', 'c.txt'];

files.forEach((file) => {
  try {
    fs.unlinkSync(file);
    console.log(`${file} удалён!`);
  } catch (err) {
    console.error(`Ошибка при удалении ${file}:`, err.message);
  }
});

6. Практика: добавляем удаление задач в наше приложение

Продолжаем развивать наше учебное приложение — простой менеджер задач, где каждая задача хранится в отдельном JSON-файле в папке tasks/.

Функция удаления задачи

const fs = require('fs');
const path = require('path');

function deleteTask(taskId) {
  const filePath = path.join(__dirname, 'tasks', `${taskId}.json`);
  fs.unlink(filePath, (err) => {
    if (err) {
      if (err.code === 'ENOENT') {
        console.error('Задача уже удалена или не существует.');
      } else {
        console.error('Ошибка при удалении задачи:', err.message);
      }
      return;
    }
    console.log(`Задача ${taskId} успешно удалена!`);
  });
}

Вызов функции

deleteTask('task-123');

Почему используем path.join?

Это помогает избежать проблем с путями на Windows и Linux — всегда используйте path.join для создания путей к файлам.

7. Особенности и нюансы

Можно ли удалить папку с помощью fs.unlink?

Нет! fs.unlink работает только с файлами. Если вы попытаетесь удалить папку — получите ошибку. Для удаления папок используйте fs.rmdir (устаревший) или fs.rm (современный способ с опцией { recursive: true }).

Что если файл используется другим процессом?

Если файл "открыт" другой программой (например, вы открыли его в блокноте), попытка удалить его может привести к ошибке resource busy или аналогичной. Всегда проверяйте ошибки!

Ошибки прав доступа

Если у Node.js нет прав на удаление файла (например, файл защищён или вы не владелец), будет ошибка с кодом EACCES или EPERM.

8. Типичные ошибки при удалении файлов

Ошибка №1: Не проверяется ошибка в колбэке.
Очень часто новички просто пишут fs.unlink('file.txt', () => {}) и не смотрят, что вернулось в err. В результате программа "думает", что файл удалён, хотя на самом деле его не было или не хватило прав. Всегда проверяйте err!

Ошибка №2: Использование fs.unlinkSync в серверном коде.
Синхронные методы блокируют весь поток Node.js. Если вы используете их в сервере или в приложении с пользователями — при удалении большого файла сервер может "зависнуть" для всех. Используйте асинхронные методы!

Ошибка №3: Попытка удалить папку через fs.unlink.
Удалять папки надо другими методами (fs.rm или fs.rmdir). Если передать путь к папке в fs.unlink, будет ошибка EISDIR: illegal operation on a directory.

Ошибка №4: Не учитываются платформенные особенности путей.
Жёстко прописанный путь типа 'tasks/task-1.json' может не сработать на Windows. Используйте path.join для кроссплатформенности.

Ошибка №5: Нет обработки случая, когда файла уже нет.
Если пользователь пытается удалить уже удалённую задачу, ваш код должен корректно обработать ошибку с кодом ENOENT и не пугать пользователя страшными сообщениями.

1
Задача
Модуль 4: Node.js, Next.js и Angular, 3 уровень, 3 лекция
Недоступна
Асинхронное удаление файла
Асинхронное удаление файла
1
Задача
Модуль 4: Node.js, Next.js и Angular, 3 уровень, 3 лекция
Недоступна
Удаление нескольких файлов с обработкой ошибок
Удаление нескольких файлов с обработкой ошибок
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ