为什么 7-zip / WinRAR 在将文件移动到目的地之前要将其解压到“临时”位置?
我觉得直接解压到目的地没有任何优势。这真的很烦人,尤其是对于大文件(就像现在这样!)。
编辑:
请解释为什么他们没有完成到位。
答案1
您究竟是如何提取文件的?您使用的是命令行还是 GUI?您是拖动文件还是选择文件并使用提取功能?您使用的是 shell 扩展上下文菜单吗?
如果你进入目标文件夹,然后选择提取功能或使用 shell 扩展,那么它们不要先解压到一个临时文件夹,然后直接解压到目标位置。
如果您在 UI 中选择文件并拖将它们复制到目标文件夹,然后将要提取到临时文件夹。
原因在于如何选择目标。如果您输入目标文件夹或使用上下文菜单项,则程序会准确知道需要提取到哪里。但是,如果您只是拖动文件,那么由于拖放功能奥林巴斯程序不知道目标文件夹在哪里。换句话说,探索者接收目标文件夹,而不是归档程序。因此,程序不知道从哪里提取它们,所以只是将它们提取到临时文件夹,然后 Explorer 在完成后将它们移动。通过使用这两种方法提取大文件,您可以清楚地看到这一点。当您将其拖出到文件夹时,它会提取,然后您会看到 Explorer 的标准文件操作对话框将其移动到该文件夹。如果您指定文件夹并单击提取,它会提取并且不会进行进一步的处理。
欢迎阅读7-Zip 的源代码看看如何处理提取位置。
几年前,当我想在我编写的程序中实现拖放功能时,我经历了痛苦后才学到了这一点。
答案2
这样做是为了将解压缩的内存要求保持在最低限度。
如果不使用文件系统,解压过程将在内存中进行。在内存不足的情况下,或者对于大型压缩文件,这迟早会耗尽可用内存并启动内存分页过程。
在这种情况下,分页会比仅使用文件系统慢得多,因为文件仍在解压缩(并且页面文件不断添加),而且因为在解压缩文件时,正在检查是否有错误,并且有大量的读/写操作。对页面文件来说最糟糕的事情就是这种情况。
编辑:关于临时目录的使用,这是为了遵循许多操作系统指南。如果解压失败,则无法保证执行操作的程序会自行清理。例如,它可能已崩溃。因此,目标目录中不会留下任何残留文件,操作系统会在适当的时候处理临时文件。
答案3
原因比您想象的要简单:许多程序将文件解压到 %temp%,是因为目标文件系统可能没有足够的空间。
现在,你可能会知道您的文件系统可能有足够的空间,但应用程序却没有足够的空间。如果该文件系统正在被操作系统或其他应用程序使用,并且在解压时被填满,该怎么办?
开发人员假设 %temp% 具有“无限”的空间,而您的目的地却没有。
答案4
我不是 7-zip 或 WinRAR 开发人员,因此我在此的评论纯属猜测。话虽如此,使用临时空间解压直到一切完成有助于验证所有文件是否完好无损(即 zip 文件未损坏)。
没有什么比解压一个大型压缩文件更糟糕的了,你开始处理存档开头的文件;却发现存档结尾有东西损坏了。这时,你对一切都失去了信心。
我最后要说的是,我不记得在 7-zip 中看到过这种行为。当我右键单击并在此处选择提取时,我通常可以访问正在解压的文件。您是否仔细检查过它不是某个设置?