Невозможно удалить файл, поскольку он используется другим процессом, ASP.NET Core MVC - PullRequest
0 голосов
/ 26 декабря 2018

Я использую 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

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

вы можете заменить ваш метод C # DeleteOneItem на данный код.может быть, это может работать.

[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.GC.Collect();
                System.GC.WaitForPendingFinalizers();
                System.IO.File.Delete(fullImagePath);

            }
            catch (Exception e) { }
        }
    }
    return "";
}
0 голосов
/ 26 декабря 2018
try
{
 System.GC.Collect(); 
 System.GC.WaitForPendingFinalizers(); 
 System.IO.File.Delete(fullImagePath);
}
catch(Exception e){
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...