是否可以拥有一个只在应用程序处于活动状态时才存在的目录?

时间:2014-02-21 14:26:55

标签: c# .net temporary-directory

我想使用一个临时目录,一旦应用程序停止,它将被自动删除。

框架中是否存在这样的机制,还是应该自己编写?

谢谢!

4 个答案:

答案 0 :(得分:3)

没有任何内置可以做到这一点。你可以在启动时创建文件夹并在其中锁定一个文件以防止它被另一个进程删除,但我很确定就是这样。

如果应用程序没有运行,那么这个文件夹根本不存在是很重要的,那么你需要一个监视应用程序和文件夹状态的服务。这样,如果应用程序崩溃或计算机重新启动,您将(合理地)确定该文件夹无法通过这些方案之一访问。当然,您需要在启动时自动启动服务。

答案 1 :(得分:2)

据我所知,目录中没有内置的方法,但您可以通过创建一个一次性类和using构造轻松模仿该行为,这样可确保删除该文件夹即使应用程序意外终止:

public class TempFolder : IDisposable
{
    public string RootPath { get; private set; }

    public TempFolder()
    {
        RootPath = Path.GetTempPath();
    }

    public void Dispose()
    {
        Directory.Delete(RootPath, true);
    }
}

然后,在您的申请中:

公共静态类MyApp {

public static void Main(string[] args)
{
    using(var tempFolder = new TempFolder())
    {

        // Do my stuff using tempFolder.RootPath as base path to create new files
    }

    // temporal directory will be deleted when we reach here
    // even if an exception is thrown! :)
}

}

请注意,这是一种简单的方法;小心暂时目录中的锁定文件可能导致Directory.Delete操作失败

此外,有些情况下无法调用Dispose方法:

  • 一些无法捕获的例外,例如StackOverflowExceptionOutOfMemoryException
  • 在您的应用程序生成的不同线程中抛出未捕获的异常
  • 该过程被杀死

BTW我正在使用类似的方法处理一些必须对文件进行操作的NUnit测试,到目前为止它工作正常。

答案 2 :(得分:1)

您还应该记住,应用程序可能会以不寻常的方式退出。甚至可能会关闭计算机电源。因此,重新启动程序时,该文件夹可能已存在。

答案 3 :(得分:0)

Windows API支持创建文件,以便在关闭文件的最后一个句柄时删除该文件。但是,我不确定目录是否存在。查看System.IO.File.CreateFile();FileOptions.DeleteOnClose以获取说明。另请查看underlying Win32 API - 也许您可以根据自己的需要进行调整。