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 и не пугать пользователя страшными сообщениями.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ