0

我正在尝试从服务器文件系统中删除图像文件,但出现“文件正在被另一个进程使用”错误。我正在尝试删除图像,并一口气删除了相关的缩略图。据我所知,我可以删除一个,但另一个会尝试永远失败。但是,如果我在通过 try-catch 循环时刷新页面,操作会立即成功。当我加载页面时,我正在通过 ajax 请求和 API 控制器(我的网站主要是一页)访问文件,但我是通过“使用”语句来访问的。这应该在使用后关闭手柄,但它似乎保持打开状态。我必须在客户端获取文件才能选择删除它们(浏览器内容管理器),所以我看不到它们仍在使用中。我加载缩略图并使用它'

我曾尝试将 try-catch 放入循环中并等待最后一个进程完成,但它永远不会完成,直到我刷新页面。我还尝试使用单独的 ajax 请求一次删除一个,但似乎如果我已经打开了一个文件,我无法删除它(直到我刷新页面)。

删除文件的代码(方法一):

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);
         }
    }
}

删除文件的代码(方法二):

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 无法访问,因为它正在被另一个进程使用”错误。

4

1 回答 1

0

已解决 - 我img.Dispose()在 using 语句之后添加。

于 2019-05-18T17:15:37.447 回答