文件一直在使用,直到客户端刷新页面
File remains in use until client refreshes page
我正试图从服务器文件系统中删除图像文件,但出现 'file in use by another process' 错误。我试图一口气删除图像及其关联的缩略图。据我所知,我可以删除一个,但另一个会尝试并永远失败。但是,如果我在页面循环通过 try-catch 时刷新页面,操作会立即成功。当我加载页面时,我通过 ajax 请求和 API 控制器(我的网站主要是一页)访问文件,但我是通过 'using' 语句这样做的。这应该在使用后关闭手柄,但它似乎保持打开状态。我必须在客户端获取文件才能选择删除它们(浏览器内容管理器),所以我看不到它们仍在使用中。我加载缩略图并使用它的 ID 从数据库中获取它的名称,然后使用该名称在文件系统中找到它。
我曾尝试将 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;
}
我希望图像被删除,但我收到 'file X cannot be accessed because it is in use by another process' 错误。
已解决 - 我在 using 语句后添加了 img.Dispose()
。
我正试图从服务器文件系统中删除图像文件,但出现 'file in use by another process' 错误。我试图一口气删除图像及其关联的缩略图。据我所知,我可以删除一个,但另一个会尝试并永远失败。但是,如果我在页面循环通过 try-catch 时刷新页面,操作会立即成功。当我加载页面时,我通过 ajax 请求和 API 控制器(我的网站主要是一页)访问文件,但我是通过 'using' 语句这样做的。这应该在使用后关闭手柄,但它似乎保持打开状态。我必须在客户端获取文件才能选择删除它们(浏览器内容管理器),所以我看不到它们仍在使用中。我加载缩略图并使用它的 ID 从数据库中获取它的名称,然后使用该名称在文件系统中找到它。
我曾尝试将 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;
}
我希望图像被删除,但我收到 'file X cannot be accessed because it is in use by another process' 错误。
已解决 - 我在 using 语句后添加了 img.Dispose()
。