@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;
							});
						});
					}
				}
  • Вопрос задан
  • 439 просмотров
Пригласить эксперта
Ответы на вопрос 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]);
});

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

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

Войти через центр авторизации
Похожие вопросы