题
我需要工作,一些临时文件在我的窗户的形式。净3.5应用程序。这些文件被打开,在外部应用程序,当然可以运行一个更长的时间比我的自己的程序。
是否有任何最佳做法,以确保这些临时文件的清理在任何时间以避免填写用户的硬盘"垃圾"的文件,这些文件不需要了吗?或者甚至Windows种处理这种自动?
一个很好的例子是任何邮件的客户:当你打开一个附件中的任何应用程序,通常是写到一个临时文件,该文件被打开。有没有办法找出如何将这些文件管理的清理?
使用谷歌给我看了很多很多的清理和调整工具来清理临时目录由手,但我不喜欢力的用户来这样做。:-)
任何帮助表示赞赏。
马蒂亚斯
解决方案
如果您尝试确定性清除临时文件类型的文件夹的内容,你可能删除正在使用由其他进程的文件。 Windows操作系统提供的工具,以允许用户删除这些文件时卷的可用磁盘空间达到一定的阈值。
现在,如果你能确定你使用特定的临时文件,它将不再需要后,再没有下侧,以删除特定文件。
其他提示
在.NET中你可以使用TempFileCollection
类管理一组临时文件到您的应用程序进行清理(注意,这是相当隐藏在CodeDOM的命名空间)。显然,你不能删除不是自己所拥有的任何文件,因为这些文件可能仍然被其他应用程序打开(并删除它们可能会导致严重的问题)。
清理临时文件的责任应该是在创建它们的应用程序。这是很容易。我使用一个类,看起来是这样的:
public class TempFile : IDisposable
{
public TempFile()
{ this.path = System.IO.Path.GetTempFileName(); }
public void Dispose()
{ File.Delete(path); }
private string path;
public string Path { get { return path; } }
}
如果您需要清理另一个应用程序的临时文件,它需要与你沟通的一些手段。它至少应该能够提供一个信号。然而,这样做的复杂性比仅仅有原始应用程序利用其自己的文件护理的复杂性更大。
我们也有类似的文件寿命问题 - (的WinForms)应用程序可以从一个中央储存库,可储存取一份文件,供用户查看,但用户应该能够关闭我们的应用程序没有它的影响,他们正在查看的文件。由于安全问题的文件文件需要清理,使他们没有躺在身边太久。
我们使用的解决方案是在用户的独立存储区域来创建一个日期衍生名称的文件夹,并用其作为今天的缓存。在应用关机和启动我们检查以前的过时的缓存文件夹并删除它们(和内容)。
我相信当用户注销它们将被删除。
早在当人们每天都关掉他们的电脑,这可能是一个完美的解决方案的日子。
现在,人们有可能去个月没有注销,所以它可能不会是依靠一个好主意。
此外,如果他们把他们的机器而没有关机然后将这些文件不会得到任何删除。
您可以使用手表你写的文件的文件系统观察,并等待一段时间无操作(10个minuites,1小时,1天,或什么都),然后删除该文件。
这是不会的一切工作,虽然。某些程序可能有一个文件“开放”,但可能不具备基本的文件被锁定。如果出现这种情况,那么你将无法知道当它的安全删除文件的方式。
不过,我想你可能忽略的问题。大多数人可能具有的硬盘空间反正盈余,所以他们可能不太可能碰到它。如果他们这样做,我想的Windows会弹出一个低磁盘空间对话框,让他们明确自己的临时目录,这将解决问题的选项。
<强>更新强>
我认为Windows Update将重新启动用户的计算机大约每月一次,所以当这种情况发生的临时文件应该被清除。
有没有保证不会有问题,但在实践中,我认为它应该是相当罕见的。
<强>更新2:强>
这是一个评论的推动下,我去了,实际上进行了测试,它看起来像当用户注销Windows不删除临时文件。但是,我还是要说,在OP的情况下,这是不是一个真正的问题。当它成为一个问题(因为磁盘空间不足),Windows会提示用户删除临时文件。
在使用ASP.NET临时文件,使用PAGE_DISPOSED事件删除您在页面创建的任何临时文件。否则,你最终可能会与组件的论点,即不放手,直到配置。
我使用该溶液(相当可靠):
using System.IO;
using System.Reflection;
namespace Konard.Helpers
{
public static partial class TemporaryFiles
{
private const string UserFilesListFilenamePrefix = ".used-temporary-files.txt";
static private readonly object UsedFilesListLock = new object();
private static string GetUsedFilesListFilename()
{
return Assembly.GetEntryAssembly().Location + UserFilesListFilenamePrefix;
}
private static void AddToUsedFilesList(string filename)
{
lock (UsedFilesListLock)
{
using (var writer = File.AppendText(GetUsedFilesListFilename()))
writer.WriteLine(filename);
}
}
public static string UseNew()
{
var filename = Path.GetTempFileName();
AddToUsedFilesList(filename);
return filename;
}
public static void DeleteAllPreviouslyUsed()
{
lock (UsedFilesListLock)
{
var usedFilesListFilename = GetUsedFilesListFilename();
if (!File.Exists(usedFilesListFilename))
return;
using (var listFile = File.Open(usedFilesListFilename, FileMode.Open))
{
using (var reader = new StreamReader(listFile))
{
string tempFileToDelete;
while ((tempFileToDelete = reader.ReadLine()) != null)
{
if (File.Exists(tempFileToDelete))
File.Delete(tempFileToDelete);
}
}
}
// Clean up
using (File.Open(usedFilesListFilename, FileMode.Truncate)) { }
}
}
}
}
每当你需要临时文件的使用:
var tempFile = TemporaryFiles.UseNew();
要确保应用程序关闭或崩溃后把所有的临时文件都将被删除
TemporaryFiles.DeleteAllPreviouslyUsed();
在应用程序的启动。
你可以创建一个临时文件,在其中可以保持编写的文件名创建的过程中,在处理可能是你可以(先决条件实施的IDisposable和)删除在Disponse操作方法之后完成。
其他的方式是编写独立的过程,执行清除的每一个时间间隔。
武官的日期在文件结尾,删除末尾的一天与该日期,并处理将产生的新的文件室内用新的日期结束。
一个很好的建议,由迪沃tempfilecollection类。
希望这有所帮助。