Я использую ASP.Net Core с MVC для создания приложения.Я использую Visual Studio и IIS Express в настоящее время.Ниже приведена структура моего текущего проекта:
* каталог проекта
-wwwroot
-areas
-присоединения
-контроллеры
-models
-views
В настоящее время я храню изображения в папке вложений.
Ранее я написал что-то подобное внутри своего startup.cs
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "Attachments")),
RequestPath = "/Attachments"
});
Я также сделал что-то подобное ниже:
appendImage(@Url.Content("~/Attachments/")+result.fileName);
Я сделал это для отображенияизображение на мой взгляд.Изображение отображается успешно.
Сейчас я пытаюсь добиться того, чтобы пользовательский интерфейс позволял пользователю выбирать файлы в папке вложений
Я попробовал следующий код:
string contentRootPath = _hostingEnvironment.ContentRootPath;
string fullImagePath = Path.Combine(contentRootPath + "\\Attachments", currentItemToDelete.FileName);
if (System.IO.File.Exists(fullImagePath))
{
try{
System.IO.File.Delete(fullImagePath);
}catch(Exception e){
operationResult = "Attachment Path. Internal Server Error";
}
}
Выполнение вводит if (System.IO.File.Exists(fullImagePath))
, но вызывает исключение, когда достигает System.IO.File.Delete
.Исключение гласит, что файл, который находится по этому пути, используется другим процессом.И поэтому я не могу удалить файл.Единственный процесс, который обращается к файлу, - это веб-приложение, которое я создаю / отлаживаю одновременно.Как я могу предотвратить это исключение?Нужно ли использовать другой тип кода для удаления файла?
РЕДАКТИРОВАТЬ, чтобы включить более подробную информацию:
Внутри моего представления (index.cshtml):
appendImage is aФункция javascript:
function appendImage(imgSrc) {
var imgElement = document.createElement("img");
imgElement.setAttribute('src', imgSrc);
if (imgSrc.includes(null)) {
imgElement.setAttribute('alt', '');
}
imgElement.setAttribute('id', "img-id");
var imgdiv = document.getElementById("div-for-image");
imgdiv.appendChild(imgElement);
}
Эта функция вызывается ниже:
$.ajax({
url:'@Url.Action("GetDataForOneItem", "Item")',
type: "GET",
data: { id: rowData.id },
success: function (result) {
removeImage();
appendImage(@Url.Content("~/Attachments/")+result.fileName);
$("#edit-btn").attr("href", '/Item/EditItem?id=' + result.id);
},
error: function (xhr, status, error) {
}
});
После вызова appendImage ();Я изменяю href тега <a>
.Когда пользователь нажимает на ссылку, он направляется на другую страницу (edit.cshtml).На странице изображение, находящееся по этому пути, также отображается с кодом, подобным следующему:
<img src="@Url.Content("~/Attachments/"+Model.FileName)" alt="item image" />
На этой новой странице (edit.cshtml) есть кнопка удаления,После нажатия кнопки удаления выполнение программы переходит к контроллеру, который является этой функцией контроллера:
[HttpPost]
public string DeleteOneItem(int id)
{
//query the database to check if there is image for this item.
var currentItemToDelete = GetItemFromDBDateFormatted(id);
if (!string.IsNullOrEmpty(currentItemToDelete.FileName))
{
//delete the image from disk.
string contentRootPath = _hostingEnvironment.ContentRootPath;
string fullImagePath = Path.Combine(contentRootPath + "\\Attachments", currentItemToDelete.FileName);
if (System.IO.File.Exists(fullImagePath))
{
try
{
System.IO.File.Delete(fullImagePath);
}catch(Exception e)
{
}
}
}
return "";
}
РЕДАКТИРОВАТЬ, чтобы ответить на вопрос:
Добавить в
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
до system.io.file.delete