为什么将7-zip / WinRAR文件解压缩到“ temp”,然后再将其移动到目的地?


50

为什么将7-zip / WinRAR文件解压缩到“ temp”,然后再将其移动到目的地?

对于直接将其解压缩到目标位置,我看不出任何优势。这确实很烦人,特别是对于大文件(现在!)。


编辑:

请解释为什么它们没有到位


3
如果在WinRAR中将``''指定为临时文件夹,则应将其直接提取到目标位置。

Answers:


82

您究竟如何提取文件?您在使用命令行还是GUI?您要拖动文件还是选择文件并使用提取功能?您是否正在使用shell扩展上下文菜单?

如果输入目标文件夹,然后选择提取功能或使用shell扩展名,则它们不会首先提取到临时文件夹,而是直接提取到目标。

如果您选择在UI中的文件,并拖动它们到目标文件夹,然后解压到一个临时文件夹。

原因在于选择目的地的方式。如果输入目标文件夹或使用上下文菜单项,则程序将确切知道需要将其提取到的位置。但是,如果仅拖动文件,则由于OLE的拖放功能如何工作,该程序不知道目标文件夹在哪里。换句话说,它是资源管理器接收目标文件夹,而不是归档程序。结果,程序无法知道将它们提取到哪里,因此仅将它们提取到temp文件夹中,然后一旦完成,资源管理器便将其移动。通过使用两种方法提取大文件,您可以清楚地看到这一点。将其拖到文件夹中时,它将解压缩,然后您会看到Explorer的标准文件操作对话框将其移动到文件夹中。如果指定文件夹并单击解压缩,它将解压缩并且不会进行进一步的处理。

随意细读7-Zip源代码,以了解如何处理提取位置。


几年前,当我想在正在编写的程序中实现拖放操作时,我就以这种艰难的方式学到了这一点。


7
绝对精彩-谢谢!这让我感到困惑多年,但是我从未花时间来查找“什么”以及“原因”。奇怪的是,我发现C:temp文件夹已填充到wazoo中,我跋涉Winrar的选项来查找它的位置必须设置为首先提取到C:上的temp文件夹。但是,我没有找到它。我从未连接过这两种方法之间的相关性,现在欣赏光明了:)谢谢!
Coldblackice 2012年

2
这里的一件事是资源管理器不移动文件,而是复制文件。这确实很令人讨厌,因为移动速度非常快(除非从一个分区移动到另一个分区),并且应该是理想的选择(这不会浪费空间),但是Microsoft的白痴们认为从临时文件夹复制是个好主意然后只需保留临时文件夹数据即可。提取巨大的存档不仅要占用两倍的空间,而且还需要几乎两倍的时间!
ADTC

他们可能有充分的理由,这可能是由于Windows 3时代初次设计OLE时对系统和/或DDE所基于的DDE的某种限制。今天可能适用或可能不适用的限制。
Synetech

1
是的,这很繁琐,尤其是在空间有限的虚拟机上。使用“提取到”在大约1分钟的时间内将包含6000多个文件的8GB RAR存档解压缩。但是,如果将文件夹拖出,则解压缩到临时目录所需的时间相同,但是此外,它冻结目标窗口,然后以3mb / s的速度复制文件超过15分钟。即使我可以通过网络以数百MB / s的速度将另一个虚拟机中的文件复制到该虚拟机上,在同一驱动器上复制文件的速度特别慢(可能是由于底层虚拟文件系统所致)。
Triynko 2015年

1
我猜可能的解决方法是用GUID名称创建一个0字节的文件,即实际上不太可能作为重复的文件名出现。然后,监视explorer.exe的文件句柄,以查看将文件复制到的位置。最后将存档提取到目标位置。
Zv_oDD 2015年

1

这样做是为了将减压所需的内存保持在最低水平。

如果他们不使用文件系统,则将在内存中进行解压缩。在内存不足的情况下,或对于较大的压缩文件,这或早或晚会耗尽可用内存并开始内存分页过程。

在这种情况下,分页将比仅使用文件系统慢很多,因为文件仍在被解压缩(并且页面文件一直在添加),而且还因为在解压缩文件时正在检查文件是否有错误,因此很多读/写操作。页面文件可能发生的最坏的事情。

编辑:关于临时目录的使用,因此要遵循许多操作系统准则。如果解压缩失败,则不能保证执行该操作的程序会在执行后自行清理。例如,它可能已崩溃。这样,目标目录中将不会残留任何文件,并且操作系统会在认为适当时将其丢弃。


3
虽然为真,但这并不能解释为什么文件先压缩到一个临时目录,然后再移动到目标目录。该手术也可能在该处进行。
slhck 2011年

3
编辑以更好地反映您的问题
矮人

4
@Dante,那不是真的。在同一分区上移动文件只会将文件系统中文件的索引更改为新目录,它不会复制任何数据,只需要瞬间。不相信我吗?尝试一下,从一个文件夹中剪切一个多GB的文件,然后将其粘贴到另一个文件夹中;不到一秒钟。他们将相同的东西尝试到另一个驱动器或分区。需要几分钟。
Dour High Arch

3
关于“操作系统在认为适当时将丢弃临时文件”:Windows是否曾经这样做过?
grawity 2011年

1
这个完全错误的答案应该被删除。7zip仅在拖放操作期间解压缩到临时文件夹,这是由于Windows的限制。有关更多信息,请参见superuser.com/questions/197961/…
dss539

-1

原因比您想象的要简单:许多程序将文件解压缩为%temp%,原因是目标文件系统可能没有足够的空间。

现在,您可能知道文件系统可能有足够的空间,但是应用程序却没有。如果该文件系统被OS或其他应用程序使用,并且在解压缩时被填满怎么办?

开发人员假设%temp%具有“无限”的空间,而目的地没有。


不完全的; 这不是使用临时目录的原因。应用程序确实(或至少可以知道)是否有足够的空间。首先,存档器确切地知道解压缩后的压缩文件有多大,可以事先分配它们,然后在解压缩时将其填充,其次,查询驱动器上的可用空间非常简单。此外,如果没有足够的空间,则它会在可能的时候进行解压缩,然后在空间用尽时抛出错误。
Synetech 2011年

实际上,这确实是答案。仅仅因为应用程序可以在目标位置上预分配空间,并不意味着它将拥有对其的独占访问权。该应用程序可以查询目标并查看其是否有足够的空间,但是在进行查询时,在能够分配空间之前,另一个应用程序可以占用其中的一些空间。
Keltari 2011年

最重要的是,用户临时空间在文件系统级别上与该用户相关联。如果发生崩溃或其他故障,其他用户将看不到临时文件。目标可能没有这样的安全性限制,因此它不使敏感数据挂在另一个文件系统上更为安全。
Keltari 2011年

就像我说的,如果在解压缩时用尽,它只会给出一条错误消息。提取到临时驱动器将如何修复它?如果没有足够的空间,则在将文件提取到临时驱动器之后就没有足够的空间,这将浪费所有这些CPU周期,并且将驱动器读/写提取到临时驱动器中几乎一无所有。就像我在回答中说的那样,请随意阅读7-Zip的源代码,或者联系Alexander Roshal向他询问有关WinRAR的信息。此外,就像我也说过的那样,如果您指定目标或使用上下文菜单,则不会使用%temp%。
Synetech 2011年

-2

不是7-zip或WinRAR开发人员,我在这里的评论纯粹是猜测。话虽这么说,使用临时空间将其解压缩到所有内容都完整为止,这有助于验证所有文件是否完整(即zip没有损坏)。

没有什么比解压缩大型压缩文件更糟糕的了,因为压缩文件的开头已经开始处理文件了。只是发现档案末尾有损坏。那时,您对一切失去信心。

我最后的评论是,我不记得从7-zip中看到过这种行为。当我右键单击并在此处说“解压缩”时,通常在解压缩文件时可以访问这些文件。您是否仔细检查过它不是某个地方?


第三段:我找不到这样的设置,这是我刚才提取的一大堆文件(4G),我很确定所有4G最终都移动缓慢。

第二段:如果压缩文件已损坏,解压缩到“临时”不会阻止任何操作。

它可以防止您从损坏的zip中查看文件。逻辑是在验证所有内容之前您什么都看不到。就设置而言,我不确定该告诉您什么。如果我告诉7-zip将大的tar文件提取到我的桌面,我会立即开始查看这些文件。可能是因为tar不是压缩格式。
柯克(Kirk)

>逻辑是在验证所有内容之前您什么都看不到。太荒谬了 那您将如何从损坏的存档中恢复某些文件?之所以没有体验,是因为您使用了shell扩展名,而不是从GUI中拖动文件。
Synetech
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.