Чому 7-zip / WinRAR розпаковують файли на "темп", перш ніж переміщувати їх до місця призначення?


50

Чому 7-zip / WinRAR розпаковують файли, щоб "темп", перш ніж перемістити їх до місця призначення?

Я не бачу жодної переваги перед просто розпакуванням місця призначення. Це дійсно дратує, особливо для великих файлів (як це зараз!).


Редагувати:

Поясніть, будь ласка, чому їх не роблять на місці .


3
Якщо ви вказали `` як тимчасову папку в WinRAR, вона повинна витягнутись безпосередньо до пункту призначення.

Відповіді:


82

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

Якщо ви введете папку призначення, а потім виберіть функцію вилучення або використовуєте розширення оболонки, вони спочатку не витягуються до тимчасової папки, вони витягуються безпосередньо до пункту призначення.

Якщо ви виберете файли в інтерфейсі і перетягніть їх у цільову папку, то вона буде вилучена у тимчасову папку.

Причина полягає в тому, як обрано пункт призначення. Якщо ви вводите цільову папку або використовуєте пункт контекстного меню, програма точно знає, куди її потрібно витягнути. Однак якщо ви просто перетягуєте файли, то завдяки тому, як функція перетягування OLE працює, програма не знає, де знаходиться цільова папка. Іншими словами, це Провідникяка отримує цільову папку, а не програму архівації. Як результат, програма не може знати, де їх витягти, і тому просто витягує їх у папку temp, після чого Explorer переміщує їх, як тільки це буде зроблено. Це можна зрозуміти, витягнувши великий файл, використовуючи обидва способи. Коли ви перетягуєте його в папку, вона витягується, тоді ви бачите стандартне діалогове вікно функціонування файлу Explorer, яке переміщує його до папки. Якщо вказати папку і натиснути Витягнути, вона витягується і подальша обробка не проводиться.

Не соромтеся вивчити вихідний код для 7-Zip, щоб побачити, як обробляється місце вилучення.


Я дізнався це важким шляхом кілька років тому, коли хотів реалізувати перетягування програми, про яку писав.


7
Абсолютно геніально - дякую за це! Це розорило мене роками, але я ніколи не витрачав часу, щоб відстежувати "що" і чому ". Незвичайний раз, коли я знаходжу свою папку C: temp, заповнену до whazoo, я розглядаю параметри Winrar, щоб знайти, де це треба встановити, щоб спочатку витягнути в темп-папку на C:. Але, на жаль, я не знаходжу її. Я ніколи не зв'язував взаємозв'язок між двома методами, і тепер ціную бачити світло :) Дякую!
Coldblackice

2
Тут не так - це те, що Explorer не переміщує файл, а скопіює його. Що насправді дратує, оскільки переміщення відбувається дуже швидко (за винятком переходу з розділу на розділ) і мав стати ідеальним вибором (він не витрачає місця), але ідіоти в Microsoft вважають, що це чудова ідея скопіювати з тимчасової папки тоді просто залиште дані тимчасової папки, що лежать навколо. Мало того, що видобуток величезного архіву займе вдвічі більше місця, це також займе майже вдвічі більше!
ADTC

Вони, мабуть, мали для цього вагомі причини, і це могло бути пов’язано з деяким обмеженням систем та / або DDE, на яких воно базувалося, коли вони вперше спроектували OLE, ще за часів Windows 3; обмеження, яке може або не може застосовуватися сьогодні.
Synetech

1
Так, це недоцільно, особливо на віртуальній машині з обмеженим простором. Використовуючи "витягнути", розпаковує 8 ГБ архіву RAR з 6000+ файлами приблизно за 1 хвилину. Однак, якщо ви перетягуєте папки, потрібен стільки ж часу, щоб розпакувати їх у тимчасовий каталог, але, крім того, воно заморожує цільове вікно, а потім КОПІЮє файли протягом понад 15 хвилин зі швидкістю 3 Мб / с. Це особливо повільне копіювання файлу на один диск (можливо, через базову віртуальну файлову систему), навіть якщо я можу скопіювати файл з іншої віртуальної машини на цю машину через мережу в сотні Мб / с.
Трайнко

1
Я думаю, що потенційною проблемою було б створення 0-байтового файлу з ім'ям GUID, тобто практично неправдоподібним явищем як дублікату імені файлу. Потім слідкуйте за файлом Explor.exe, щоб переглянути, куди він копіює файл. Нарешті витягніть архів до місця призначення.
Zv_oDD

1

Це робиться, щоб вимоги до пам'яті для декомпресії були зведені до мінімуму.

Якщо вони не використовували файлову систему, декомпресія відбудеться в пам'яті. За умов недостатньої пам’яті або для великих стислих файлів це рано чи пізно вичерпає наявну пам’ять і запустить процес підкачки пам'яті.

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

EDIT: Що стосується використання тимчасового каталогу, це так, щоб дотримуватися багатьох вказівок операційної системи. Якщо декомпресія не вдається, немає гарантії, що програма, яка виконує операцію, очиститься після себе. Наприклад, він може розбитися. Таким чином, жоден залишковий файл не залишається у вашому цільовому каталозі, і операційна система видалить тимчасовий файл, коли вважає за потрібне.


3
Хоча це правда, це не пояснює, чому файли спочатку стискаються до тимчасового каталогу, а потім переміщуються до цільового. Операція також може відбуватися саме там.
slhck

3
Відредаговано, щоб краще відобразити ваше запитання
Гном

4
@Dante, це неправда. Переміщення файлу на одному розділі просто змінює індекс файлу у файловій системі на новий каталог, він не копіює жодних даних і займає лише мить. Не вірите мені? Спробуйте, виріжте файл з декількома ГБ з однієї папки та вставте його в іншу папку; це займає менше секунди. Вони спробують те ж саме на іншому диску або розділі. Займає хвилин.
Dour High Arch

3
Повторно "операційна система розпорядиться тимчасовим файлом, коли вважає за потрібне": Windows коли-небудь це робить?
grawity

1
Цю повністю помилкову відповідь слід усунути. 7zip декомпресується лише в темп-папку під час операцій перетягування, і це пов'язано з обмеженнями Windows. Для отримання додаткової інформації див. Superuser.com/questions/197961/… .
dss539

-1

Причина простіша, ніж ви думаєте: Багато програм розпаковують файли до% temp%, полягає в тому, що в цільовій файловій системі може бути недостатньо місця.

Тепер ви можете знати, що у вашій файловій системі може бути достатньо місця, однак додаток цього не робить. Що робити, якщо ця файлова система використовується ОС або іншим додатком і заповнюється під час декомпресії?

Розробники роблять припущення, що% temp% має "необмежений" простір, тоді як ваш пункт призначення - ні.


Не зовсім; це не привід використовувати тимчасовий каталог. Додаток знає (або принаймні може) знати, чи достатньо місця чи ні. По-перше, архіватор точно знає, наскільки великі стиснуті файли, коли вони розпаковуються, і може заздалегідь виділити їх, а потім заповнити їх, коли він розпаковується, по-друге, досить просто запитати вільний простір на диску. Крім того, якщо місця не вистачає, він просто розкладається, поки може, а потім видає помилку, коли у нього не вистачає місця.
Synetech

Власне, це цілком відповідь. Тільки тому, що програма може попередньо виділити простір у цільовому пункті призначення, це не означає, що він матиме ексклюзивний доступ до нього. Додаток може запитувати місце призначення та бачити, чи має у ньому достатньо місця, але поки цей запит відбувається, перш ніж він зможе виділити простір, інша програма може зайняти частину цього простору.
Келтарі

Крім того, тимчасовий простір користувачів прив’язаний до цього користувача на рівні файлової системи. Якщо стався збій або інший збій, інший користувач не міг бачити тимчасові файли. Цільові обмеження можуть не мати таких обмежень безпеки, тому безпечніше не мати конфіденційних даних, що знаходяться в іншій файловій системі.
Келтарі

Як я вже говорив, якщо він закінчується при розпакуванні, він просто видає повідомлення про помилку. Як би виправити витяг на тимчасовий привід? Якщо місця не вистачає, то після вилучення файлів на тимчасовий диск не вистачає місця, і він витрачає всі ці цикли процесора та диск читає / записує витяг на тимчасовий диск. Як я вже говорив у своїй відповіді, не соромтеся вивчити вихідний код для 7-Zip або зв’яжіться з Олександром Рошалем, щоб запитати його про WinRAR. Крім того, як я вже сказав, якщо ви вказуєте ціль або використовуєте контекстне меню, воно не використовує% temp%.
Synetech

-2

Не будучи розробником 7-zip або WinRAR, мої коментарі тут - суто спекуляція. Це було сказано, використовуючи тимчасовий простір для розпакування, поки все не завершиться, допоможе перевірити, чи всі файли недоторкані (тобто, що пошкодження не пошкоджено).

Немає нічого гіршого, як розпакувати великий стислий файл, розпочавши роботу над файлами на початку архіву; лише щоб з’ясувати, що в кінці архіву щось пошкоджено. У цей момент ви втрачаєте довіру до всього.

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


3-й абзац: я не можу знайти такі налаштування, і це велика купа файлів (4G), яку я витягував саме зараз, я впевнений, що нарешті всі 4G повільно переміщуються.

2-й абзац: витяг до "temp" нічого не перешкоджає, якщо заархівований файл вже пошкоджений.

Це не дозволяє вам бачити файли зі зіпсованого блискавки. Логіка полягає в тому, що ви нічого не можете побачити, поки все не буде перевірено. Що стосується налаштування, я не впевнений, що вам сказати. Якщо я скажу 7-zip витягти великий файл tar на свій робочий стіл, я починаю бачити файли негайно. Це може бути тому, що tar - це не стислий формат.
Кірк

> Логіка полягає в тому, що ви нічого не можете побачити, поки все не буде перевірено. Це абсурд. Як тоді ви відновили деякі файли з корумпованого архіву? Причина цього не виникає через те, що ви використовували розширення оболонки замість перетягування файлів із графічного інтерфейсу.
Synetech
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.