Почему 7-zip / WinRAR распаковывают файлы в «temp» перед тем, как переместить их в место назначения?

50

Почему 7-zip / WinRAR распаковывают файлы в «temp» перед тем, как переместить их в место назначения?

Я не вижу никаких преимуществ по сравнению с прямым распаковыванием в пункт назначения. Это действительно раздражает, особенно для больших файлов (как сейчас!).


Редактировать:

Пожалуйста, объясните, почему они не сделаны на месте .

Stevoisiak
источник
3
Если вы указываете `` как временную папку в WinRAR, она должна извлекаться непосредственно в место назначения.

Ответы:

82

Как именно вы распаковываете файлы? Вы используете командную строку или графический интерфейс? Вы перетаскиваете файлы или выбираете их и используете функцию извлечения? Вы используете контекстное меню расширения оболочки?

Если вы вводите папку назначения, а затем выбираете функцию извлечения или используете расширение оболочки, то они сначала не извлекаются во временную папку, а извлекаются непосредственно в место назначения.

Если вы выберите файлы в пользовательском интерфейсе и перетащите их в целевую папку, тогда они будут извлечены во временную папку.

Причина в том, как выбран пункт назначения. Если вы входите в целевую папку или используете пункт контекстного меню, то программа точно знает, куда ее нужно извлечь. Однако если вы просто перетаскиваете файлы, то из-за того, как работает функция перетаскивания OLE , программа не знает, где находится целевая папка. Другими словами, это Explorerкоторый получает целевую папку, а не программу архивации. В результате программа не может знать, где их извлечь, и поэтому просто извлекает их во временную папку, а затем Explorer перемещает их, как только это будет сделано. Вы можете ясно видеть это, извлекая большой файл, используя оба метода. Когда вы перетаскиваете его в папку, он извлекает, а затем вы видите стандартный диалог операций с файлами в Проводнике, перемещающий его в папку. Если вы укажете папку и нажмете «Извлечь», она будет извлечена, и дальнейшая обработка не производится.

Не стесняйтесь просматривать исходный код 7-Zip, чтобы увидеть, как обрабатывается местоположение извлечения.


Я научился этому нелегко несколько лет назад, когда я хотел внедрить перетаскивание в программу, которую я писал.

Synetech
источник
7
Абсолютно блестящий - спасибо за это! Это ошеломило меня в течение многих лет, но я никогда не тратил время на то, чтобы отыскать «что» и почему ». В странные моменты я нахожу свою папку C: temp заполненной в whazoo, я брожу по параметрам Winrar, чтобы найти, где это должен быть установлен для первого извлечения во временную папку на C :. Но, увы, я не нахожу его. Я никогда не связывал корреляцию между
этими
2
Здесь неправильно то, что Explorer не перемещает файл, а копирует его. Что действительно раздражает, потому что перемещение действительно быстрое (за исключением случаев перехода от раздела к разделу) и должно было быть идеальным выбором (это не тратит пространство), но идиоты в Microsoft решили, что это хорошая идея - скопировать из временной папки затем просто оставьте данные временной папки. Не только извлечение огромного архива займет вдвое больше места, но и вдвое больше!
ADTC
У них, вероятно, была на то веская причина, и это могло быть связано с какими-то ограничениями систем и / или DDE, на которых он основывался, когда они впервые разрабатывали OLE, еще во времена Windows 3; ограничение, которое может применяться или не применяться сегодня.
Synetech
1
Да, это смешно, особенно на виртуальной машине с ограниченным пространством. Использование «extract to» распаковывает архив RAR объемом 8 ГБ с 6000+ файлами за 1 минуту. Однако, если вы перетаскиваете папки, для разархивирования во временный каталог требуется столько же времени, но, кроме того, он замораживает целевое окно, а затем копирует файлы в течение более 15 минут со скоростью всего 3 МБ / с. Это особенно медленное копирование файла на тот же диск (возможно, из-за базовой виртуальной файловой системы), хотя я могу скопировать файл с другой виртуальной машины на эту машину по сети со скоростью сотни МБ / с.
Триынко
1
Я предполагаю, что потенциальным обходным решением будет создание 0-байтового файла с именем GUID, то есть практически невозможным в качестве дублированного имени файла. Затем следите за дескрипторами файла explorer.exe, чтобы увидеть, куда он копирует файл. Наконец распакуйте архив в место назначения.
Zv_oDD
1

Это сделано для того, чтобы требования к памяти для распаковки были минимальными.

Если они не используют файловую систему, декомпрессия произойдет в памяти. При нехватке памяти или для больших сжатых файлов это рано или поздно истощит доступную память и запустит процесс подкачки памяти.

Пейджинг в этих условиях будет намного медленнее, чем просто использование файловой системы, потому что файл все еще распаковывается (и файлы страниц продолжают добавляться), но также и потому, что когда файл распаковывается, он проверяется на наличие ошибок, и поэтому много операций чтения / записи. Худшее, что может случиться с файлом подкачки.

РЕДАКТИРОВАТЬ: Что касается использования временного каталога, это так, чтобы следовать многим руководствам операционной системы. Если декомпрессия завершается неудачно, нет гарантии, что программа, выполняющая операцию, будет очищена после себя. Возможно, он разбился, например. Таким образом, в вашем целевом каталоге не остается остаточного файла, и операционная система удалит временный файл, когда сочтет нужным.

Гном
источник
3
Хотя это правда, это не объясняет, почему файлы сначала сжимаются во временный каталог, а затем перемещаются в целевой каталог . Операция также может проходить прямо там.
slhck
3
Отредактировано, чтобы лучше отразить ваш вопрос
Гном
4
@ Данте, это не правда. Перемещение файла на тот же раздел просто меняет индекс файла в файловой системе на новый каталог, не копирует данные и занимает всего одно мгновение. Не веришь мне? Попробуйте, вырежьте файл размером несколько ГБ из одной папки и вставьте его в другую папку; это займет меньше секунды. Они пробуют то же самое на другом диске или разделе. Занимает минуты.
Dour High Arch
3
«Операционная система избавится от временного файла, когда сочтет нужным»: Windows когда-либо делает это?
grawity
1
Этот полностью ложный ответ должен быть удален. 7zip распаковывается только во временную папку во время операций перетаскивания, и это связано с ограничениями Windows. См. Superuser.com/questions/197961/… для получения дополнительной информации.
dss539
-1

Причина проще, чем вы думаете: многие программы распаковывают файлы в% temp%, потому что в файловой системе назначения может не хватить места.

Теперь вы можете знать, что в вашей файловой системе может быть достаточно места, а в приложении - нет. Что если эта файловая система используется ОС или другим приложением и заполняется при распаковке?

Разработчики предполагают, что% temp% имеет «неограниченное» пространство, а место назначения - нет.

Keltari
источник
Не совсем; это не причина использовать временный каталог. Приложение знает (или, по крайней мере, может) знать, достаточно ли места или нет. Во-первых, архиватор точно знает, насколько велики сжатые файлы, когда они распакованы, и может заранее выделить их, а затем заполнить их по мере распаковки, а во-вторых, довольно просто запросить свободное место на диске. Кроме того, если не хватает места, то он просто распаковывает, когда может, а затем выдает ошибку, когда ему не хватает места.
Synetech
На самом деле, это вполне ответ. То, что приложение может предварительно распределить пространство в целевом месте назначения, не означает, что оно будет иметь к нему эксклюзивный доступ. Приложение может запросить место назначения и посмотреть, достаточно ли у него места, но пока этот запрос выполняется, прежде чем оно сможет выделить место, другое приложение может занять часть этого пространства.
Келтари
Кроме того, временное пространство пользователя связано с этим пользователем на уровне файловой системы. Если произошел сбой или другой сбой, другой пользователь не мог видеть временные файлы. У места назначения могут не быть таких ограничений безопасности, поэтому безопаснее не оставлять конфиденциальные данные в другой файловой системе.
Келтари
Как я уже сказал, если он заканчивается во время распаковки, он просто выдает сообщение об ошибке. Как это можно извлечь с помощью временного диска? Если места недостаточно, то после извлечения файлов на временный диск не хватает места, и это тратит впустую все эти циклы ЦП и чтение / запись диска, извлекаемые на временный диск даром. Как я уже сказал в своем ответе, не стесняйтесь просматривать исходный код 7-Zip или свяжитесь с Александром Рошалем, чтобы спросить его о WinRAR. Кроме того, как я уже сказал, если вы указываете цель или используете контекстное меню, она не использует% temp%.
Synetech
-2

Не будучи разработчиком 7-zip или WinRAR, мои комментарии здесь являются чисто предположениями. Тем не менее, использование временного пространства для распаковки до полного заполнения помогает проверить, что все файлы не повреждены (то есть, что zip-файл не поврежден).

Нет ничего хуже, чем распаковать большой сжатый файл, начав работать с файлами в начале архива; только чтобы узнать, что что-то повреждено в конце архива. В этот момент вы теряете уверенность во всем.

Мой последний комментарий заключается в том, что я не помню, чтобы видел такое поведение из 7-ZIP. Когда я щелкаю правой кнопкой мыши и говорю извлечение здесь, у меня обычно есть доступ к файлам, поскольку они распаковываются. Вы дважды проверили, что это не где-то настройка?

Кирк
источник
Третий абзац: я не могу найти такие настройки, и это большая группа файлов (4G), которую я только что извлек, я уверен, что все 4G были перемещены медленно, наконец.
2-й абзац: извлечение в «temp» ничего не мешает, если заархивированный файл уже поврежден.
Это мешает вам видеть файлы из поврежденного почтового индекса. Логика в том, что вы ничего не видите, пока все не проверено. Что касается настройки, я не уверен, что вам сказать. Если я скажу 7-zip извлечь большой tar-файл на рабочий стол, я сразу же начну видеть файлы. Это может быть потому, что tar не является сжатым форматом.
Кирк
> Логика в том, что вы ничего не видите, пока все не проверено. Это абсурд. Как тогда вы восстановите некоторые файлы из поврежденного архива? Причина, по которой вы этого не испытываете, заключается в том, что вы использовали расширение оболочки вместо перетаскивания файлов из графического интерфейса.
Synetech