c# - 使用 IDisposable 从磁盘中删除文件

标签 c# .net idisposable system.io.file

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

我认为这些实现中的大多数对于我需要的东西来说都有些矫枉过正,所以我已经更简单地实现了它。我类的东西不多;仅保存一个文件和一些公共(public)字符串,以允许通过其文件路径访问保存的文件。有一个用于显式删除文件的 Delete 方法和一个用于调用 Delete 的 Dispose 方法(如果客户端代码没有删除)。最后还有一个仅调用 Dispose 的终结器。类(class)是密封的。没有自己实现 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;
    }
}

关于c# - 使用 IDisposable 从磁盘中删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36947492/

相关文章:

c# - Quartz.net - 无法加载文件或程序集 Common.Logging Version=3.0.0.0

c# - NetworkCredentials 以纯文本形式公开密码

c# - 如何对终结器进行单元测试?

c# - 函数中的 Dispose 方法重要吗?

c# - 更新面板和 GridView

c# - 在 XML 文档中使用 <see cref =""/> 和可选的可为空参数

c# - 用于商业目的的 iText/iTextSharp : not recommended?

c# - 我如何正确处理此代码?

c# - 为多级表达式生成 Expression<Func<TEntity, bool>>

javascript - MVC AJAX 查询回调不起作用