@sorokinfil
Аниматор, программист

Как побороть непонятную ошибку fs.unlink в node.js?

Есть таблица в MySQL, в которой есть ссылки на картинки (оригиналы и превью). На ноде получаю все эти картинки, обхожу их в цикле и удаляю все. Если картинок больше одной пары (пара это оригинал и превью), нода выдаёт ошибку:
Error: EPERM: operation not permitted, unlink 'C:\путь_к_картинке\aa\bb\12345.jpg'
При этом сам файл 12345.jpg удаляется, а остальные (34772.jpg, 87202.jpg, ...) не удаляются, хотя должны. Решение для меня совершенно неочевидно, в интернете ничего дельного не нашёл, кроме даунгрейда npm до версии 5.3.0, который мне не помог.

Windows 7, командная строка запущена от имени администратора
Node.js 8.9.4
npm 5.3.0

Код цикла:
for (var i=0; i<result.length; i++)
				{
					if (result[i].img)
					{
						var path_image = path.resolve (CONFIG.STORAGE_DIR_PORTFOLIO, result[i].img);
						fs.open (path_image, 'r', (err, fd) =>
						{
							if (err)
							{
								/* Если файл не найден, то ничего не делаем */
								if (err.code === 'ENOENT')
									return;
								throw err;
							}
							
							/* Удаляем картинку */
							fs.unlink (path_image, function (err)
							{
								if (err)
									throw err;
							});
						});
					}
					if (result[i].image_preview)
					{
						var path_image_preview = path.resolve (CONFIG.STORAGE_DIR_PORTFOLIO, result[i].image_preview);
						fs.open (path_image_preview, 'r', (err, fd) =>
						{
							if (err)
							{
								/* Если файл не найден, то ничего не делаем */
								if (err.code === 'ENOENT')
									return;
								throw err;
							}
							
							/* Удаляем превью */
							fs.unlink (path_image_preview, function (err)
							{
								if (err)
									throw err;
							});
						});
					}
				}
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 2
@RidgeA
Есть подозрение, что проблема в том, что fs.open открывает файловый дескриптор, потому, скорее всего, файл и не удаляется корректно.
Ответ написан
megafax
@megafax
web-программист
Не бойтесь использовать синхронные функции
result.forEach((item) => {
	return ((images) => {
		images.forEach((image) => {
			if (image) {
				let pathImg = path.resolve(CONFIG.STORAGE_DIR_PORTFOLIO, image);
				return fs.existsSync(pathImg) && fs.unlinkSync(pathImg);
			}
		})
	})([item.img, item.image_preview]);
});

Или Вам еще нужен результат удаления?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
D2C.io Екатеринбург
от 70 000 руб.
OneTwoTrip! Москва
от 120 000 до 200 000 руб.
MobileUp Санкт-Петербург
от 100 000 руб.