【问题标题】:Why would one ever use the %TEMP% folder now that Storage Sense can clean it at any time?既然 Storage Sense 可以随时清理它,为什么还要使用 %TEMP% 文件夹?
【发布时间】:2020-12-30 09:21:59
【问题描述】:

从 Windows 10 开始,Storage Sense 允许用户指定%TEMP% 文件夹清理,其频率为每天一次。从技术上讲,它可以更频繁地运行设置为在低磁盘空间上激活,具体取决于一个人的磁盘使用模式。

鉴于此,%TEMP% 文件夹的意义何在?我怎么会使用一个文件夹,我放在那里的每个文件都可以在我写完后立即被系统删除?

这是一个让我印象深刻的真实世界场景(为简洁起见,代码被简化):

var ffmpegPath = Path.Combine(Path.GetTempPath(), "ffmpeg");
DownloadFfmpeg(path: ffmpegPath); 

foreach (var videoFile in videoFiles) { //suppose there are dozens of files to process
   DoSomeHeavyProcessing(ffmpegPath);   //suppose each file takes an hour to process
}

这在最初的几个小时内效果很好,但随后在某个任意时间点,下载的 ffmpeg 文件夹被删除,并且所有后续文件都无法处理。事实上,如果我理解正确,理论上即使是这样的代码也可能会失败:

var path = Path.Combine(Path.GetTempPath(), "foo");
File.WriteAllText(path, "bar");
Console.WriteLine(File.ReadAllText(path));

现在,我知道如何解决这个问题了 - 只需使用 %APPDATA%%LOCALAPPDATA%%PROGRAMDATA%。但这就是重点 - 自从 Storage Sense 出现以来,我为什么要使用 %TEMP% 而不是以前的文件夹?

【问题讨论】:

    标签: windows-10 temp appdata programdata


    【解决方案1】:

    %TEMP% 文件夹——顾名思义——用于存放临时文件,这些文件只在(通常很短的)一段时间内需要,之后可以删除。在理想情况下,每个写入临时文件夹的应用程序都会在之后清理并删除它创建的临时文件,当它们不再需要时。但这不会发生,因此%TEMP% 文件夹往往会变得很大。

    您可以通过获取文件上的文件锁定轻松防止 Storage Sense 删除您仍然需要的文件。只要%TEMP% 文件夹中的文件在使用中,就不会被删除。文件处理完成后,您可以释放文件锁定,这意味着您不再需要该文件,并且可以在下次运行 Storage Sense 时将其删除。

    这样做的好处是,您的应用不再需要清理“混乱”(即临时文件)。只要需要,只需让应用程序锁定它们即可。锁被释放后(或者应用退出,文件锁也会被释放),它们会被系统自动删除。

    【讨论】:

    • 赞成,但我有一些保留意见:(1)在我设法获得锁定之前,从技术上讲,该文件可以被删除(2)由于某种原因,我可能没有锁定文件的权限(3)诚然,最后两个不太可能发生,但我下载的文件越多,机会就越高(例如,上面的 ffmpeg 示例可能有很多 dll)(4)我可能无法锁定文件,因为我希望其他程序能够锁定使用它们(例如,我锁定了一些 ffmpeg 配置文件,而 ffmpeg 因此无法运行) - 是的,我每次都可以解锁并重新锁定,但这更麻烦,更有可能出现异常
    • 另外,不能保证 Storage Sense 会运行(可能是用户禁用了它,其实我认为它默认是关闭的)。即使确实如此,也不能保证我的文件是否以及何时会被删除。所以实际上感觉就像我承担了清理的所有责任,同时必须为自动清理的所有潜在陷阱做好准备和编码。老实说,只是保存到 %APPDATA% 之类的东西,并在之后清理 finally 块(如果我真的想成为一个好撒玛利亚人,甚至是 FileOptions.DeleteOnClose)似乎更简单。
    • 您的论点基于低磁盘空间行为。当这在创建文件的几秒钟内咬到你时,你的系统无论如何都会遇到严重的问题。在这种紧急情况下,你不能依赖任何东西。另一方面,如果您及时做出反应,例如当磁盘空间低于 5% 时,就可以了。