我有一个需求,需要将上传的
我认为大多数这样的实现对于我所需的功能来说过于复杂了,所以我使用了更简单的方法进行了实现。我的类中没有太多东西,只是保存文件和一些公共字符串,以通过文件路径访问保存的文件。还有一个Delete方法,专门用于删除文件,以及一个Dispose方法在客户端代码没有调用Delete时调用它。最后,有一个finalizer(终结器)仅调用Dispose方法。这个类是sealed的。没有任何成员本身实现IDisposable。没有重要的托管资源。据我估计,没有必要进一步干预垃圾收集,因为唯一重要的事情就是删除文件。
那么我的问题是:
1.这种处理“temp”文件的方法有什么本质上的问题吗?
2.考虑到我不需要清理受控资源,我的IDisposable实现是否存在任何问题?
请注意,在我的用例中,文件必须保存到磁盘以供另一段代码使用,并且需要通过其文件路径访问该文件,而不是通过传递流等方式。
HttpPostedFile
保存到服务器的磁盘上,然后将其完整路径提供给某些会使用该文件的代码,最后删除该文件。我决定为处理该文件创建一个代理。代理抽象了将文件保存到磁盘和在不再使用时删除它的细节。我利用IDisposable实现了这个代理,以将已保存的文件视为未托管的资源并确保其在某个时刻被删除。当然,每次我尝试实现IDisposable时,我都会仔细检查这个模式,并发现涵盖所有最复杂实现的数十个问题和文章。我认为大多数这样的实现对于我所需的功能来说过于复杂了,所以我使用了更简单的方法进行了实现。我的类中没有太多东西,只是保存文件和一些公共字符串,以通过文件路径访问保存的文件。还有一个Delete方法,专门用于删除文件,以及一个Dispose方法在客户端代码没有调用Delete时调用它。最后,有一个finalizer(终结器)仅调用Dispose方法。这个类是sealed的。没有任何成员本身实现IDisposable。没有重要的托管资源。据我估计,没有必要进一步干预垃圾收集,因为唯一重要的事情就是删除文件。
那么我的问题是:
1.这种处理“temp”文件的方法有什么本质上的问题吗?
2.考虑到我不需要清理受控资源,我的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);
}
}
}