如何创build程序终止后自动删除的临时文件

我一直在寻找无处不在,我似乎无法find任何地方使用GetTempFileName创build的临时文件在应用程序终止后,似乎留下了这样的选项。

我该怎么做呢?

在创建文件时使用FileOptions.DeleteOnClose

 using (var fs = new FileStream(Path.GetTempFileName(), FileMode.Open, FileAccess.ReadWrite, FileShare.None, 4096, FileOptions.DeleteOnClose)) { // do your work here } 

一旦流关闭,文件将被删除。

如果您需要打开整个文件,您可以使用FileShare.ReadWrite | FileShare.Delete打开文件流 FileShare.ReadWrite | FileShare.Delete而不是FileShare.None然后再打开相同的文件名,当你需要访问整个程序中的文件。 然后关闭流,当你退出程序。

注意:您不一定需要显式关闭流,关闭程序的行为将关闭流并进行必要的清理以删除文件。 如果确实按照这种方法进行操作,请确保只要程序处于活动状态,就可以引用该流,否则GC可能会清理流并在早期删除该文件。

更新:如果你有一个权力的损失,你仍然有一个文件在磁盘上,但如果你的程序强制关闭结束任务该文件将仍然被删除。 删除操作在内核级而不是应用程序级上进行。 一旦文件的最后一个句柄被关闭,Windows本身就是删除文件的东西。

尽管您可能无法使文件在断电时被删除,但还有另一个选项可以最大限度地减少留下的磁盘上的临时文件大小。 这将要求你深入一层,直接调用CreateFile 。 有一个标志FILE_ATTRIBUTE_TEMPORARY你可以使用,这将是告诉Windows不刷新写入到磁盘,只是如果可能的话,让他们在缓存中。 有了这个属性文件可能会被留下,但有一个很好的机会,该文件可能是0KB的大小。

 [DllImport("kernel32.dll", SetLastError = true, CharSet=CharSet.Unicode)] static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile); public const uint OPEN_EXISTING = 3 public const uint GENERIC_READ = 0x80000000; public const uint GENERIC_WRITE = 0x40000000; public const uint FILE_ATTRIBUTE_TEMPORARY = 0x100; public const uint FILE_FLAG_DELETE_ON_CLOSE = 0x04000000; public FileStream OpenTempFile() { var path = Path.GetTempFileName(); var handle = CreateFile(path, GENERIC_READ | GENERIC_WRITE, 0, IntPtr.Zero ,OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE ,IntPtr.Zero); if (handle.IsInvalid) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } return new FileStream(handle, FileAccess.ReadWrite); } 

上面的代码是在浏览器中编写的,所以可能包含一个或两个错误,但是它可以得到一般的想法。

UPDATE2:即使电源丢失,删除文件的一件事是使用WinAPI调用MoveFileEx ,它可以通过使用MOVEFILE_DELAY_UNTIL_REBOOT标志并将IntPtr.Zero传递给IntPtr.Zero来在下次重新引导时删除文件。