如果我的应用程序关闭或崩溃,有什么好方法可以确保删除临时文件?理想情况下,我希望获得一个临时文件,使用它,然后忘记它.

现在,我保留了一个临时文件列表,并使用应用程序触发的EventHandler删除它们.应用程序退出.

有更好的办法吗?

推荐答案

如果进程过早终止,则无法保证任何结果,但是,我使用"using"来实现这一点..

using System;
using System.IO;
sealed class TempFile : IDisposable
{
    string path;
    public TempFile() : this(System.IO.Path.GetTempFileName()) { }

    public TempFile(string path)
    {
        if (string.IsNullOrEmpty(path)) throw new ArgumentNullException("path");
        this.path = path;
    }
    public string Path
    {
        get
        {
            if (path == null) throw new ObjectDisposedException(GetType().Name);
            return path;
        }
    }
    ~TempFile() { Dispose(false); }
    public void Dispose() { Dispose(true); }
    private void Dispose(bool disposing)
    {
        if (disposing)
        {
            GC.SuppressFinalize(this);                
        }
        if (path != null)
        {
            try { File.Delete(path); }
            catch { } // best effort
            path = null;
        }
    }
}
static class Program
{
    static void Main()
    {
        string path;
        using (var tmp = new TempFile())
        {
            path = tmp.Path;
            Console.WriteLine(File.Exists(path));
        }
        Console.WriteLine(File.Exists(path));
    }
}

现在,当TempFile被处置或垃圾收集时,该文件被删除(如果可能).显然,您可以随心所欲地严格限定作用域,或者在某个集合中使用它.

.net相关问答推荐

.NET发布的应用程序运行与开发不同的端口

获取Ef-Core集合的DeleteBehavior

为什么脚本不从 _Layout 加载并且必须添加到部分视图中?

使用 Powershell TOM 在 SSAS 表格中创建分区

System.IO.Directory.Exists 在 LINQ 语句中失败,但在 foreach 循环中没有

xunit Assert.ThrowsAsync() 不能正常工作?

编译时禁用 Dll 文化文件夹

使用 C# 清除文本文件的内容

使文本框不可编辑

调用委托与方法的性能

实体框架 - 无法将 lambda 表达式转换为类型字符串,因为它不是委托类型

react 式扩展使用的好例子

在未安装 Visual Studio 的机器上使用 FUSLOGVW.EXE

等效于 C# 在 powershell 中的使用关键字?

使用+运算符的字符串连接

更改 SqlConnection 超时

如何从文件中删除单个属性(例如只读)?

如何在 Dapper.Net 中编写一对多查询?

将控制台输出镜像到文件

当它被抛出和捕获时,不要在那个异常处停止调试器