如果我的应用程序关闭或崩溃,有什么方法可以确保删除临时文件?理想情况下,我想获取一个临时文件,使用它,然后忘记它.
现在我保留一个我的临时文件列表,并使用在Application.ApplicationExit上触发的事件处理程序删除它们.
有没有更好的办法?
使用.net框架,您可以选择使用.net框架创建临时文件
Path.GetTempFileName();
Run Code Online (Sandbox Code Playgroud)
MSDN没有告诉我们临时文件会发生什么.我记得在某个地方读到它们在重启时会被操作系统删除.这是真的?
如果操作系统没有删除这些文件,为什么它们被称为临时文件?它们是普通目录中的普通文件.
我一直认为答案是肯定的,但现在我正试图找到真相.
当我使用创建临时文件时Path.GetTempFileName(),Windows会自动清除它吗?
如果我在下面创建一个目录Path.GetTempPath()呢?窗户会清理它吗?
或者开发人员有责任删除在那里创建的文件吗?
我正在开发一个程序,它会生成一些临时文件,等待用户对一些事情的输入,然后使用这些临时文件进行操作。
我想知道我是否可以可靠地期望这些临时文件在我完全使用它们之前不会消失(例如,它们会在用户工作时消失吗?)。
显然,我可以在我的 appdata 中创建我自己的文件夹并将其用于临时文件。但是使用 C#Path.GetTempFileName()或Path.GetTempPath() + somename. 何时删除以这种方式创建的文件?
澄清一下,我不是在寻找如何创建临时文件,而是在寻找在其中创建的临时文件GetTempPath()保留多长时间,以及在使用它们之前等待用户输入的时间是否足够长。
从 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
}
Run Code Online (Sandbox Code Playgroud)
这在最初的几个小时内效果很好,但随后在某个任意时间点,下载的ffmpeg文件夹被删除,并且无法处理所有后续文件。事实上,如果我理解正确的话,理论上即使是这样的代码也可能会失败:
var path = Path.Combine(Path.GetTempPath(), "foo");
File.WriteAllText(path, "bar");
Console.WriteLine(File.ReadAllText(path));
Run Code Online (Sandbox Code Playgroud)
现在,我知道如何解决这个问题 - 只需使用%APPDATA%,%LOCALAPPDATA%或%PROGRAMDATA%。但这就是重点 - 自从 Storage Sense 出现以来,为什么我会使用%TEMP%而不是以前的文件夹?
我有一个用Python编写的应用程序,它将大量数据写入该%TEMP%文件夹.奇怪的是,每过一次,它就会死去,然后回来IOError: [Errno 28] No space left on device.驱动器有足够的可用空间,%TEMP%不是自己的分区,我是管理员,系统没有配额.
Windows是否人为地对数据设置了某些类型的限制%TEMP%?如果没有,有什么可能导致这个问题的想法?
编辑:在下面的讨论之后,我澄清了这个问题,以便更好地解释发生了什么.