Файл остается в использовании, пока клиент не обновит страницу - PullRequest
0 голосов
/ 18 мая 2019

Я пытаюсь удалить файлы изображений из файловой системы сервера, но я получаю сообщение об ошибке «файл используется другим процессом». Я пытаюсь удалить изображение и его миниатюру одним махом. Я могу заставить один удалить, но другой попытается потерпеть неудачу навсегда, насколько я видел. Однако, если я обновлю страницу, пока она повторяет попытку, операция сразу же завершится успешно. Когда я загружаю страницу, я обращаюсь к файлам через запросы ajax и контроллеры API (мой сайт в основном состоит из одной страницы), но я делаю это с помощью операторов using. Это должно закрыть ручку после использования, но, кажется, остается открытым. Я должен получить файлы на стороне клиента, чтобы иметь возможность удалить их (менеджер содержимого браузера), поэтому я не вижу, как они все еще используются. Я загружаю миниатюру и использую ее идентификатор, чтобы получить его имя из базы данных, и использую имя, чтобы найти его в файловой системе.

Я пытался поместить try-catch в цикл и ждать завершения последнего процесса, но этого не произойдет, пока я не обновлю страницу. Я также пытался удалять по одному с отдельными ajax-запросами, но кажется, что если я вообще открыл файл, я не могу удалить его (пока не обновлю страницу).

Код для удаления файла (метод 1):

public static void DeleteFromFileSystem(string path)
{
     for (int i = 1; i <= 10000; ++i)
         {
         try
         {
             System.IO.File.Delete(path);
             break;
         }
         catch (IOException e) when (i <= 10000)
         {
             Thread.Sleep(3);
         }
    }
}

Код для удаления файла (метод 2):

public static void DeleteFromFileSystem(string path)
{
     using(FileStream f = System.IO.File.OpenWrite(path))
     {
          System.IO.File.Delete(path);
     }
}

Код для получения изображения (работает нормально, но может быть проблемой):

public static byte[] ImageToByte(string name, bool getThumbnail)
{
    if (name == null) name = "user.png"; //default profile picture
    string path = getThumbnail ? "wwwroot/ImgThumb/" : "wwwroot/ImgFull/";

    // this line is my best suspect
    System.Drawing.Image img = System.Drawing.Image.FromFile(path + name);

    byte[] b;
    using (MemoryStream mStream = new MemoryStream())
    {
         img.Save(mStream, img.RawFormat);
         b = mStream.ToArray();
         mStream.Close(); // I added this as a precautionary. It didn't help.
    }
    return b;
}

Я ожидаю, что изображения будут удалены, но я получаю сообщение об ошибке «файл X не доступен, потому что он используется другим процессом».

1 Ответ

0 голосов
/ 18 мая 2019

решено - я добавил img.Dispose() после оператора использования.

...