我有一种情况,我需要将上传的文件保存HttpPostedFile
到服务器的磁盘,提供一些代码的完整路径,这些代码将对磁盘上的文件执行某些操作,然后删除文件。我决定制作一个代理来处理该文件。代理抽象了将文件保存到磁盘并在不再使用时将其删除的详细信息。我在代理中实现了 IDisposable,以便将保存的文件视为非托管资源并确保它在某个时候被删除。当然,每次我尝试实现 IDisposable 时,我都会仔细检查模式并发现数十个关于该主题的问题和文章,涵盖了所有最复杂的实现。
我认为这些实现中的大多数对于我需要的东西来说都是多余的,所以我更简单地实现了它。我的课上没有多少;仅保存一个文件和一些公共字符串,以允许通过其文件路径访问已保存的文件。如果客户端代码没有,则有一个用于显式删除文件的 Delete 方法和一个用于调用 Delete 的 Dispose 方法。最后还有一个只调用 Dispose 的终结器。班级是密封的。没有成员自己实现 IDisposable。没有可观的托管资源。在我看来,没有必要进一步干预垃圾收集,因为唯一需要发生的重要事情就是删除文件。
所以我的问题是:
- 以这种方式处理保存和删除“临时”文件有什么本质上的错误吗?
- 考虑到我不需要为托管资源清理而烦恼,我的以下 IDisposable 实现是否存在任何问题。
请注意,在我的用例中,必须将文件保存到磁盘以供另一段代码使用,并且需要使用其文件路径访问该文件,而不是通过传递流或类似的方式。
public sealed class TempFileProxy : IDisposable
{
private bool disposed;
public TempFileProxy(HttpPostedFile httpPostedFile)
{
this.disposed = false;
this.FileName = httpPostedFile.FileName;
this.Directory = AppSettings("TempFileDirectory");
this.FullPath = $@"{this.Directory}\{this.FileName}";
httpPostedFile.SaveAs(this.FullPath);
}
~TempFileProxy()
{
this.Dispose();
}
public string FullPath { get; }
public string Directory { get; }
public string FileName { get; }
public void Dispose()
{
if (this.disposed)
{
return;
}
this.disposed = true;
this.Delete();
}
public void Delete()
{
if (File.Exists(this.FullPath))
{
File.Delete(this.FullPath);
}
}
}