Windows 10 既然Storage Sense可以随时清理%TEMP%文件夹,为什么还要使用它呢?

Windows 10 既然Storage Sense可以随时清理%TEMP%文件夹,为什么还要使用它呢?,windows-10,temp,appdata,programdata,Windows 10,Temp,Appdata,Programdata,从Windows 10开始,Storage Sense允许用户指定每天清理一次的%TEMP%文件夹。从技术上讲,如果设置为在磁盘空间较低的情况下激活,它可以更频繁地运行,具体取决于磁盘使用模式 有鉴于此,%TEMP%文件夹的意义是什么?我将如何使用一个文件夹,在这个文件夹中,我放在那里的每个文件都可以在我写完后立即被系统删除 下面是一个现实世界中的场景,我想到了这一点(为简洁起见,代码简化): var ffmpegPath=Path.Combine(Path.GetTempPath(),“ffm

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

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

下面是一个现实世界中的场景,我想到了这一点(为简洁起见,代码简化):

var ffmpegPath=Path.Combine(Path.GetTempPath(),“ffmpeg”);
下载ffmpeg(路径:ffmpegPath);
foreach(videoFiles中的var videoFile){//假设有几十个文件要处理
DoSomeHeavyProcessing(ffmpegPath);//假设每个文件需要一小时的处理时间
}
这在最初的几个小时内效果很好,但在某个任意时间点,下载的
ffmpeg
文件夹被删除,所有后续文件都无法处理。事实上,如果我理解正确,理论上即使这样的代码也可能失败:

var path=path.Combine(path.GetTempPath(),“foo”);
writealText(路径,“bar”);
Console.WriteLine(File.ReadAllText(path));

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

正如名称所示,
%TEMP%
文件夹用于临时文件,这些文件只需要一段时间(通常很短)就可以删除。在理想情况下,每一个写入临时文件夹的应用程序都会在以后进行清理,并在不再需要临时文件时删除它创建的临时文件。但这并没有发生,因此
%TEMP%
文件夹往往变得庞大

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


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

投票通过,但我有一些保留:(1)在我设法获得锁之前,技术上可以删除文件(2)出于某种原因,我可能没有锁定文件的权限(3)诚然,后两种情况不太可能发生,但我下载的文件越多,可能性就越大(例如,上面的ffmpeg示例可能有许多DLL)(4)我可能无法锁定文件,因为我希望其他程序使用它们(例如,我锁定了一些
ffmpeg
配置文件,并且
ffmpeg
因此无法运行)-是的,我可以每次解锁和重新锁定,但这更麻烦,更可能出现异常。此外,存储感知根本无法保证运行(可能是用户禁用了它,事实上我认为默认情况下它处于关闭状态)。即使是这样,也不能保证我的文件会在何时被删除。所以实际上,我感觉自己承担着清理的所有责任,同时必须为自动清理的所有潜在陷阱做好准备并编写代码。老实说,如果我真的想成为一个好撒玛利亚人的话,用
finally
块(甚至
FileOptions.DeleteOnClose
)保存到
%APPDATA%
之类的东西似乎简单得多。你的论证是基于磁盘空间不足的行为。如果在创建文件后的几秒钟内,您的系统就会出现严重问题。在这种紧急情况下,你不能依靠任何东西。另一方面,如果您及时做出反应,例如当磁盘空间低于5%时,您就没事了。