Яка користь написання в тимчасове місце, а потім копіювання до призначеного пункту призначення?


48

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

Ці програми спочатку записують у папку temp, а потім копіюють її до призначеного пункту призначення.

Приклад: 7zip спочатку витягує в папку temp, а потім копіює вилучені дані в те місце, в яке ви попросили його витягти дані.

Я бачу кілька проблем із таким підходом:

  1. У папці temp може не вистачити місця, тоді як місце розташування може мати стільки місця.

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

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


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

1
Ви впевнені, що це "копіювання" файлу, а не "переміщення" його? Велика різниця.
франк

З сайту blogs.rsa.com/… , для шкідливих програм перевага полягає в 1) гарантована працездатність дозволяє уникнути виявлення "червоних помилок", перш ніж ви навіть повністю завантажили вірус на комп'ютер користувача 2) TEMP-диски зазвичай швидші (RAMDisk), скорочуючи час на виявлення, поки вірус ще перебуває на етапі завантаження (як тільки вірус повністю сформується і вдасться його виконати за 0,05 секунди, гра закінчена, тож це гонка часу)
Pacerier

3) Поки ви ще завантажуєте чи працюєте, якщо антивірус натрапив на вас (сам, не знаючи, іноді) і залишив ваші кістки лежачи, ви все одно можете розраховувати на x% шанс, що ОС або користувач випадково допоможе вам видалити ваші мертві кістки, хоча вони грубо очищають речі з папки TEMP, це допомагає зменшити ймовірність виявлення.
Pacerier

Відповіді:


96

Я думаю про декілька причин:

  • На більшості платформ ходи файлів є атомними, але запис файлів - ні, особливо якщо ви не можете записати всі дані за один раз. Отже, якщо у вас є типовий шаблон виробника / споживача (один процес створює файли, інший дивиться каталог і збирає все, що знайде), записуючи спочатку в папку temp і лише потім переходячи до реального місця, споживач ніколи не може побачити незакінчений файл.
  • Якщо процес, що записує файл, відмирає на півдорозі, у вас на диску вийшов несправний файл. Якщо він знаходиться в реальному місці, вам слід подбати про його очищення самостійно, але якщо він знаходиться в тимчасовому місці, ОС подбає про це.
  • Якщо файл створюється під час запуску завдання резервного копіювання, завдання може зібрати неповний файл; каталоги temp, як правило, виключаються із резервного копіювання, тому файл буде включений лише один раз, коли він переміщений до кінцевого пункту призначення.
  • Каталог temp може знаходитись у швидкій, але мінливій файловій системі (наприклад, ramdisk), яка може бути корисною для таких речей, як завантаження декількох фрагментів одного файлу паралельно або обробка файлів на місці з великою кількістю прагнень. Крім того, тимчасові каталоги, як правило, викликають більшу фрагментацію, ніж каталоги з рідкісним читанням, записом та видаленням, а зберігання темп-каталогу на окремому розділі може допомогти зменшити фрагментацію інших розділів.

TL; DR - він зводиться здебільшого до атомності, тобто ви хочете зробити так, щоб (у кінцевому місці) файл був або повним, або його взагалі не було в будь-який момент часу.


12
Якщо каталог темп знаходиться на окремому розділі, ви втрачаєте атомність.
yfeldblum

16
Деякі програми витягуватимуть / копіюватимуть у передбачуваний каталог, але вони використовуватимуть тимчасове розширення файлу (наприклад, .tmp) та перейменують його після завершення.
Dan Diplo

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

1
Випадок Dan Diplo корисний при оновленні наявного файлу. Ви не хочете замінювати стару, поки нова не буде успішно записана, щоб не записати нову помилку чи щось інше прочитати нове, перш ніж воно буде повністю написане.
RalphChapin

1
На жаль, хоча папки Temp OS пронизані старими файлами та папками, оскільки ОС не очищає їх! Тож ми як розробники повинні все-таки прибирати це! superuser.com/questions/296824/…
markmnl

15

Здається, це проблема в Windows, більш конкретно пов'язана з тим, як керується перетягуванням.

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

Ось цікава частина:

Механіка перетягування та перетягування Windows не дозволяє джерелом програми операцій перетягування легко визначати, куди файли скидаються. Передача файлів до пункту призначення залежить від цільової програми (зазвичай Windows Explorer). Це досить розумно, оскільки вихідний додаток навряд чи може перенести файли у всі можливі пункти призначення. Майте на увазі, що ви можете видаляти файли не лише до каталогу, але навіть до ZIP-файлу (або будь-якого іншого архіву), віддаленого каталогу (через FTP, SFTP, SCP,…), сміття,…

Очевидно, що навіть Провідник Windows (або будь-який інший цільовий додаток, наприклад WinZip) не може завантажувати файли з будь-якого можливого джерела (особливо він не знає SFTP / SCP).

Також спеціально для 7Zip: користувач ray023 відповідає на це запитання у запитанні SuperUser Stack Q&A: https://superuser.com/a/422463

В основному, якщо замість перетягування вашого файлу ви використовуєте метод "витягнути сюди", доступний у bith 7-ZIP та Winrar, файли знаходяться безпосередньо в потрібному каталозі.


2
Питання було не "Чому 7zip використовує тимчасові файли?" Актуальне питання було "Чому тимчасові файли зазвичай використовуються при розробці програмного забезпечення?"
Філ

@Phil Наведений приклад - з того, що я розумію, що відбувається, коли ви перетягуєте один файл з архіву в папку системи, не вимагаючи чітко "витягти його". Але я перечитував питання, і так, я думаю, ви маєте рацію в тому, що автор хотів дізнатися більше про корисність тимчасових папок, на які, до речі, майстерно відповіли tdammers (+1 проголосував і мене)
Джалайн

У той час як ваша відповідь була не точно те, що я шукав, +1, для вирішення моєї проблеми з 7zip
Devdatta Tengshe

1
Хороший коментар в основному зводиться до: чому програма використовує темп-папку? Тому що при перетягуванні не знає папку призначення і просто "дає" вікнам, тоді Windows переймає і ставить файл у потрібне місце.
Пітер Б

0

Якщо вам доведеться виконати будь-яку обробку даних у файл (декодувати / перетворити / тощо.), Тоді краще використовувати тимчасовий файл і після його завершення і лише після завершення перенести результат до кінцевого пункту призначення.

Переваги:

  1. Лише готові файли досягають пункту призначення
  2. Тимчасовий файл може (повинен) знаходитися на швидких носіях
  3. Уникайте фрагментації остаточного файлу
  4. Дозволяє використовувати інші медіа в якості кінцевого пункту призначення (ftp, хмара, будь-що)
  5. Абонентські тимчасові файли простіше очистити

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.