【问题标题】:Cannot delete uploaded file after saving to disk [duplicate]保存到磁盘后无法删除上传的文件[重复]
【发布时间】:2021-07-21 23:51:49
【问题描述】:

使用 C# 和 .net 4.8,我有一个 API 方法供用户上传文件。

我将文件保存到临时目录,进行一些处理,然后将其保存到最终目标目录。

在进程结束时,我想从临时目录中删除文件,但出现异常:

该进程无法访问该文件,因为它正被另一个进程使用。

在这一行:

File.Delete(originalTmpPath);

为了缩小问题的范围,我已经删除了所有进行额外处理的代码,所以现在我的代码只做 3 件事:

  1. 将文件保存到临时目录。
  2. 将“在临时目录中”的文件保存到另一个目录。
  3. 删除第一个文件

这里是 API 中的代码:

HttpResponseMessage result = null;
var httpRequest = HttpContext.Current.Request;

var file = httpRequest.Files[0];
// Save image to temp folder
file.SaveAs(originalTmpPath);

// Save image to final folder
Bitmap bmp = new Bitmap(System.Drawing.Image.FromFile(originalTmpPath));
bmp.Save(originalPath);

//Exception here:
File.Delete(originalTmpPath);

知道如何停止进程/解锁文件并删除它吗?

谢谢

【问题讨论】:

  • 就在这里System.Drawing.Image.FromFile(originalTmpPath)可能没有释放资源。使用变量并调用dispose。如果可行,请在代码的最终版本中使用using (var img = ...)
  • 您需要Dispose() of bmp 才能删除它。可能,使用using 语句(using 块内的Save())声明位图对象。 Clone() 法师,如果您之后仍然需要位图。无论您创建什么图形对象,您都需要处理掉它。
  • 有趣。我认为 SO 问题不能有相同的标题..

标签: c# .net


【解决方案1】:

如果您不操作文件,请在文件中使用InputStream

Bitmap bmp = new Bitmap(file.InputStream);
bmp.Save(originalPath);

然后

File.Delete(originalTmpPath);

当然,将文件保存到服务器是没有用的。

或使用

using(Bitmap bmp = new Bitmap(originalTmpPath))
{
    bmp.Save(originalPath);
}
File.Delete(originalTmpPath);

【讨论】:

  • 使用using 的全部意义在于不明确地调用bmp.Dispose();
  • 与 bmp.Dispose();代码运行没有错误。但是我删了。
  • “代码运行无误”。最好是。因为如果您收到错误 Dispose 未正确实施。但话又说回来,usingtry/catch/finally,如果对象实现了IDisposable,则在finally 中调用Disposedocs.microsoft.com/en-us/dotnet/standard/garbage-collection/…
  • 使用“使用”,样本在内存中执行,在操作结束或发生错误时,内存被释放,样本被销毁。 Dispose() 方法在操作结束或错误结束时存在实例时调用。
猜你喜欢
  • 2018-08-12
  • 2013-12-26
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 2011-06-27
  • 2016-02-20
  • 2016-07-22
相关资源
最近更新 更多