文件会一直使用,直到客户端刷新页面

时间:2019-05-18 16:55:01

标签: c# asp.net-mvc delete-file file-in-use

我正在尝试从服务器文件系统中删除图像文件,但是出现“文件正在被另一个进程使用”错误。我正在尝试删除该图像及其关联的缩略图。据我所知,我可以删除其中一个,但另一个将永远失败。但是,如果在尝试捕获中循环时刷新页面,该操作将立即成功。加载页面时,我通过ajax请求和API控制器(我的站点通常是一页)访问文件,但是我使用“ using”语句来访问文件。使用后应将其关闭,但似乎保持打开状态。我必须在客户端获取文件才能选择删除它们(浏览器内容管理器),所以我看不到它们仍在使用中。我加载缩略图,并使用其ID从数据库中获取其名称,并使用该名称在文件系统中找到它。

我尝试将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 :(得分:0)

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