Какая польза от записи во временное местоположение, а затем копирования его в место назначения?

48

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

Эти программы сначала записывают в временную папку, а затем копируют ее в место назначения.

Пример: 7zip сначала извлекает во временную папку, а затем копирует извлеченные данные в место, в которое вы просили его извлечь данные.

Я вижу несколько проблем с этим подходом:

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

  2. Если это большой файл, для операции копирования может потребоваться немалое количество времени.

Я много думал об этом, но не увидел ни одного положительного момента в этом. Я что-то упустил или есть реальная выгода для этого?

Девдатта Тенгше
источник
Если приложение требует этого, сделайте это. В противном случае, делать то, что имеет смысл. Ваш мозг говорит вам, что это не нужно в этом случае. Я нахожусь в лагере по выполнению наименьшего объема работы, насколько вы можете судить по моему ответу, поэтому я рекомендую выполнять наименьшее количество работы для приложения.
Джейсон Себринг,
1
Вы уверены, что он «копирует» файл, а не «перемещает» его? Большая разница.
Франк
Из blogs.rsa.com/... , для сигнатур, преимущество 1) Гарантированный writability позволяет избегать обнаружений «красная ошибки» , прежде чем вы даже полностью загрузили вирус на компьютер пользователя 2) TEMP дисков, как правило , быстрее (RAMDisk) сокращение времени для обнаружение, когда вирус все еще находится на стадии загрузки (как только вирус полностью сформирован и его выполнение выполняется в течение 0,05 секунды, игра окончена, так что это гонка времени)
Pacerier
3) Пока вы все еще скачиваете или работаете, если антивирус врезался в вас (сам не зная, иногда) и оставил ваши кости лежать без дела, вы все равно можете рассчитывать на x% вероятности того, что ОС или пользователь случайно помогут вам удалить Ваши мертвые кости, в то время как они занимаются массовой очисткой из папки TEMP, это помогает снизить вероятность обнаружения.
Pacerier

Ответы:

96

Несколько причин, которые я могу придумать:

  • На большинстве платформ перемещение файлов является атомарным, а запись файлов - нет (особенно если вы не можете записать все данные за один раз). Таким образом, если у вас есть типичный шаблон «производитель / потребитель» (один процесс создает файлы, другой просматривает каталог и берет все, что он находит), сначала записывает во временную папку и только затем перемещается в реальное местоположение, что означает, что потребитель никогда не увидит незаконченный файл.
  • Если процесс, который записывает файл, умирает на полпути, у вас есть поврежденный файл на вашем диске. Если он находится в реальном месте, вы должны позаботиться о его очистке самостоятельно, но если он находится во временном местоположении, ОС позаботится об этом.
  • Если файл создается во время выполнения задания резервного копирования, задание может выбрать неполный файл; временные каталоги, как правило, исключаются из резервных копий, поэтому файл будет включен только после перемещения в конечный пункт назначения.
  • Временный каталог может находиться в быстрой, но нестабильной файловой системе (например, виртуальном диске), что может быть полезно для таких вещей, как параллельная загрузка нескольких фрагментов одного и того же файла или выполнение обработки файла на месте с большим количеством операций поиска. Кроме того, временные каталоги имеют тенденцию вызывать большую фрагментацию, чем каталоги с менее частым чтением, записью и удалением, а сохранение временного каталога в отдельном разделе может помочь предотвратить фрагментацию других разделов.

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

tdammers
источник
12
Если временный каталог находится в отдельном разделе, вы теряете атомарность.
yfeldblum
16
Некоторые программы будут извлекать / копировать в предполагаемый каталог, но они будут использовать временное расширение файла (например, .tmp) и переименовывать его по завершении.
Дан Диплом
5
Иногда запись во временный файл также полезна, когда несколько экземпляров вашей программы могут пытаться загрузить один и тот же файл одновременно, и вы не можете полагаться на файловую систему для обеспечения правильного уровня блокировки (например, плохо определенный API облачного хранилища) , Использование временного файла гарантирует, что полученный файл не будет содержать данные обеих загрузок. Конечно, это просто еще один пример атомарности.
Кшиштоф Козельчик
1
Случай Dan Diplo полезен при обновлении существующего файла. Вы не хотите заменять старый, пока новый не будет успешно записан, иначе запись нового не удастся или что-то еще прочитает новый, прежде чем он будет полностью записан.
RalphChapin
1
К сожалению, временные папки ОС изобилуют старыми файлами и папками, потому что ОС не очищает их! Так что мы, как разработчики, должны все же очистить это! superuser.com/questions/296824/…
markmnl
15

Это кажется проблемой в Windows, более конкретно связанной с управлением перетаскиванием.

Разработчики клиента WINSCP разработали свое собственное расширение оболочки, которое отменяет это поведение перетаскивания и позволяет сразу же перенести файл в нужную папку. Они объясняют хитрость в своей документации и, что более интересно, в чем проблема и как они ее решили.

Вот интересная часть:

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

Очевидно, что даже Windows Explorer (или любое другое целевое приложение, например WinZip) не может загружать файлы из любого возможного источника (в частности, он не знает SFTP / SCP).

Кроме того, специально для 7Zip: пользователь ray023 отвечает на этот вопрос в стэке SuperUser Q & A: https://superuser.com/a/422463

По сути, если вместо перетаскивания файла вы используете метод извлечения здесь, доступный в bith 7-ZIP и Winrar, файлы будут непосредственно извлечены в нужный каталог.

Jalayn
источник
2
Вопрос был не в том, «почему 7zip использует временные файлы?» Фактический вопрос был «Почему временные файлы обычно используются при разработке программного обеспечения?»
Фил
@Phil Из приведенного примера видно, что происходит, когда вы перетаскиваете один файл из архива в папку в системе, без явного запроса «извлечь его». Тем не менее, я перечитал вопрос, и да, я думаю, вы правы в том, что автор хотел узнать больше об утилите временных папок, на которую, кстати, мастерски ответил tdammers (+1 проголосовал и я тоже)
Джалайн
Хотя ваш ответ был не совсем тем, что я искал, +1, для решения моей проблемы с 7zip
Devdatta Tengshe
1
Хороший комментарий сводится к следующему: почему программа использует временную папку? Поскольку при перетаскивании он не знает папку назначения и просто «отдает» ее окнам, тогда окна вступают во владение и помещают файл в нужное место.
Питер Б
0

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

Выгоды:

  1. Только завершенные файлы достигают места назначения
  2. Временный файл может (должен) находиться на быстром носителе
  3. Избегайте фрагментации в конечном файле
  4. Позволяет использовать другие носители в качестве конечного пункта назначения (ftp, облако, что угодно)
  5. Прерванные временные файлы легче чистить

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

roetnig
источник