使用IDisposable从磁盘中删除文件



我有一种情况,我需要将上传的HttpPostedFile保存到服务器的磁盘上,提供它的完整路径到一些代码,这些代码将对磁盘上的文件进行处理,然后删除该文件。我决定制作一个处理该文件的代理。代理抽象了将文件保存到磁盘并在不再使用时将其删除的详细信息。我在代理中实现了IDisposable,以便将保存的文件视为非托管资源,并确保它在某个时刻被删除。当然,每次我尝试实现IDisposable时,我都会仔细检查模式,并发现几十个问题和文章,这些问题和文章涵盖了所有最复杂的实现。

我认为这些实现中的大多数都超出了我的需求,所以我实现得更简单。我班上没有多少东西;只需要保存一个文件和一些公共字符串,就可以通过文件路径访问保存的文件。有一个Delete方法用于显式删除文件,如果客户端代码没有,则有一个Dispose方法用于调用Delete。最后还有一个终结器,它只调用Dispose。该类已封存。没有成员自己实现IDisposable。没有相当多的管理资源。据我估计,没有必要进一步干预垃圾回收,因为唯一需要做的重要事情就是删除文件。

所以我的问题是:

  1. 以这种方式保存和删除"临时"文件有什么固有的错误吗
  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);
        }
    }
}

使用IDisposable实现删除临时文件没有错。不过,删除它时要更加小心——您不希望在该操作期间引发异常(例如,因为文件正在使用中)。此外,如果您已经使用常规Dispose调用处理了对象,请抑制终结器:

~TempFileProxy() { 
    Dispose(false);
}
public void Dispose() { 
    Dispose(true); 
}
private void Dispose(bool disposing)
{
    if (disposing)
    {
        GC.SuppressFinalize(this);                
    }
    if (this.FullPath != null)
    {
        try { 
            File.Delete(this.FullPath); 
        }
        catch { }
        this.FullPath = null;
    }
}

我这里有几个问题:

1) 我在文件方面遇到了问题。某些外部设备上存在故障。我已经到了这样一个地步,我只是尝试使用该文件,并在抛出异常时捕获它。

2) 文件。删除可以引发。2a)文件正在被某个东西使用。2b)还有一把幻影锁。(Windows 8 XPS查看器,我正看着你!)2c)网络问题。

最新更新