#c# #file-io
#c# #file-io
Вопрос:
Я реализовал помощник для отображения эскизов из здесь. Рядом с миниатюрой есть ссылка на удаление, которая вызывает этот контроллер:
// HTTP POST: /Photo/Delete/1
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Delete(int id, string confirmButton)
{
var path = "~/Uploads/Photos/";
Photo photo = photoRepository.GetPhoto(id);
if (photo == null)
return View("NotFound");
FileInfo TheFile = new FileInfo(Server.MapPath(path photo.PhotoID ".jpg"));
if (TheFile.Exists)
{
photoRepository.Delete(photo);
photoRepository.Save();
TheFile.Delete();
}
else return View("NotFound");
return View();
}
Если я отключу отображение эскизов, файл будет удален. В противном случае он отправляет ошибку:
Исключение System.IO.IOException: процесс не может получить доступ к файлу ‘C:Documents и настройки ilijaМои документыVisual Studio 2008ProjectsCMSCMSUploadsPhotos26.jpg ‘ потому что он используется другим процессом.
Я также не знаю, правильно ли написана моя функция удаления файла. При поиске в сети я вижу, что все используют File.Delete(TheFile);
то, что я не могу использовать, и я использую TheFile.Delete();
. При использовании File.Delete(TheFile);
я получаю следующую ошибку:
Ошибка 1 ‘System.Web.Mvc.Controller.Файл (строка, string, string)’ — это ‘метод’, который недопустим в данном контексте C:Documents и настройкиilijaМои документыVisual Studio 2008ПроектыCMSCMSКонтроллеры PhotoController.cs 109 17 CMS
Я что-то здесь упускаю?
Ответ №1:
Это потому, что, как говорится, другой процесс получил доступ к вашему файлу, поэтому вы не можете его удалить. В этом случае генератор эскизов перехватил дескриптор вашего файла, не позволяя вам удалить его. Вы должны закрыть все дескрипторы файла в вашей программе, чтобы удалить его.
Комментарии:
1. Я знаю, что thumb generator использует файл, я подумал, может быть, файл. Delete() имеет к этому какое-то отношение?
2. Я не знаю остальной части вашего кода, но я предполагаю, что ваш генератор эскизов каким-то образом открывает дескриптор вашего файла (например, используя класс Bitmap). Когда вы закончите использовать файл для создания эскиза, вам нужно .close() класс bitmap (или любой другой класс, использующий файл), чтобы иметь возможность удалить его.
3. что именно я должен закрыть. В ссылке, которую я разместил в своем вопросе, есть класс Bitmap bitmap = new Bitmap(путь к файлу); Но bitmap. Close() не работает.
4. @ile: Извините, я имел в виду bitmap.Dispose(). Посмотрите на мой отредактированный ответ, я думаю, что, возможно, я обнаружил проблему.
5. НЕПРАВИЛЬНО: блок finally всегда будет попадать, даже если вы «выполните возврат» из блока try!