Jaka jest korzyść z pisania w lokalizacji tymczasowej, a następnie kopiowania jej do zamierzonego miejsca docelowego?

47

Piszę aplikację, która działa ze zdjęciami satelitarnymi, a mój szef poprosił mnie, abym przejrzał niektóre aplikacje komercyjne i zobaczył, jak się zachowują. Znalazłem dziwne zachowanie, a potem, gdy szukałem, znalazłem je również w innych standardowych aplikacjach.

Programy te najpierw zapisują do folderu tymczasowego, a następnie kopiują go do zamierzonego miejsca docelowego.

Przykład: 7zip najpierw rozpakowuje do folderu tymczasowego, a następnie kopiuje wyodrębnione dane do lokalizacji, w której poprosił o wyodrębnienie danych.

Widzę kilka problemów z tym podejściem:

  1. Folder tymczasowy może nie mieć wystarczającej ilości miejsca, podczas gdy docelowa lokalizacja może mieć tyle miejsca.

  2. Jeśli jest to duży plik, operacja kopiowania może zająć nie bez znaczenia.

Dużo o tym myślałem, ale nie widziałem ani jednego pozytywnego punktu, aby to zrobić. Czy coś mi umknęło, czy też jest to naprawdę korzystne?

Devdatta Tengshe
źródło
Jeśli aplikacja tego wymaga, zrób to. W przeciwnym razie rób to, co ma sens. Twój mózg mówi ci, że w tym przypadku nie jest potrzebny. Jestem w obozie, wykonując jak najmniej pracy, o czym można powiedzieć na podstawie mojej odpowiedzi, więc zalecam wykonanie jak najmniej pracy dla aplikacji.
Jason Sebring
1
Czy na pewno „kopiuje” plik, a nie „przenosi”? Duża różnica.
frankc
Z blogs.rsa.com/... , w przypadku złośliwego oprogramowania , zaletą jest 1) Gwarantowana możliwość zapisu zapobiega wykryciu „czerwonego błędu”, zanim jeszcze w pełni ściągniesz wirusa na komputer użytkownika 2) Dyski TEMP są zwykle szybsze (RAMDisk), skracając czas na wykrywanie, gdy wirus jest jeszcze w fazie pobierania (gdy wirus zostanie w pełni utworzony i będzie działał przez 0,05 sekundy, gra się kończy, więc jest to wyścig czasu)
Pacerier
3) Gdy nadal pobierasz lub uruchamiasz, jeśli program antywirusowy uderzył w ciebie (czasem nie wiedząc, czasami) i pozostawił kości leżące w pobliżu, nadal możesz liczyć na x% szansy, że system operacyjny lub użytkownik przypadkowo pomoże Ci usunąć twoje martwe kości, podczas gdy masowo usuwają rzeczy z folderu TEMP, pomaga to zmniejszyć prawdopodobieństwo wykrycia.
Pacerier

Odpowiedzi:

95

Kilka powodów, o których mogę myśleć:

  • Na większości platform ruchy plików są atomowe, ale zapisy plików nie (szczególnie jeśli nie możesz zapisać wszystkich danych za jednym razem). Więc jeśli masz typowy wzorzec producenta / konsumenta (jeden proces produkuje pliki, drugi ogląda katalog i zbiera wszystko, co znajdzie), najpierw pisząc do folderu tymczasowego, a dopiero potem przenosząc się do rzeczywistej lokalizacji, oznacza to, że konsument nigdy nie zobaczy niedokończony plik.
  • Jeśli proces zapisywania pliku umrze w połowie, na dysku jest uszkodzony plik. Jeśli znajduje się w prawdziwej lokalizacji, musisz sam zająć się jej czyszczeniem, ale jeśli znajduje się w tymczasowej lokalizacji, system operacyjny się tym zajmie.
  • Jeśli plik zostanie utworzony podczas działania zadania tworzenia kopii zapasowej, zadanie może pobrać niekompletny plik; katalogi tymczasowe są na ogół wykluczone z tworzenia kopii zapasowych, więc plik zostanie dołączony dopiero po przeniesieniu do ostatecznego miejsca docelowego.
  • Katalog tymczasowy może znajdować się w szybkim, ale ulotnym systemie plików (np. Ramdysku), co może być korzystne w przypadku takich rzeczy, jak pobieranie kilku porcji tego samego pliku równolegle lub przetwarzanie w miejscu pliku z dużą ilością prób. Ponadto katalogi tymczasowe powodują większą fragmentację niż katalogi z mniejszą częstotliwością odczytu, zapisu i usuwania, a utrzymywanie katalogu tymczasowego na osobnej partycji może pomóc w utrzymaniu fragmentacji pozostałych partycji na niskim poziomie.

TL; DR - sprowadza się głównie do atomowości, to znaczy, że chcesz, aby (w ostatecznej lokalizacji) plik był kompletny lub w ogóle go nie było w danym momencie.

tdammers
źródło
12
Jeśli katalog tymczasowy znajduje się na osobnej partycji, tracisz atomowość.
yfeldblum
16
Niektóre programy rozpakują / skopiują do zamierzonego katalogu, ale użyją tymczasowego rozszerzenia pliku (np. Tmp) i zmienią jego nazwę po zakończeniu.
Dan Diplo
5
Czasami zapisywanie do pliku tymczasowego jest również przydatne, gdy kilka instancji Twojego programu może próbować załadować ten sam plik w tym samym czasie i nie możesz polegać na systemie plików, aby zapewnić odpowiedni poziom blokowania (jak źle zdefiniowane API przechowywania w chmurze) . Użycie pliku tymczasowego sprawi, że plik wynikowy nie skończy się mieszaniem danych z obu przesłanych plików. Oczywiście jest to tylko kolejny przypadek atomowości.
Krzysztof Kozielczyk
1
Przypadek Dana Diplo jest przydatny podczas aktualizacji istniejącego pliku. Nie chcesz zastępować starego, dopóki nowy nie zostanie pomyślnie zapisany, aby nie powieść zapisu nowego lub coś innego przeczytać nowego, zanim zostanie w pełni napisany.
RalphChapin
1
Niestety foldery Temp systemu operacyjnego są pełne starych plików i folderów, ponieważ system operacyjny ich nie usuwa! Więc jako programiści powinniśmy to posprzątać! superuser.com/questions/296824/…
markmnl
15

Wydaje się, że jest to problem w systemie Windows, bardziej konkretnie związany ze sposobem zarządzania przeciąganiem.

Twórcy WinSCP klienta opracowali własne rozszerzenie powłoki, które zastępują to zachowanie Przeciągnij i pozwala natychmiast upuszczenie pliku do prawego folderu. Wyjaśniają sztuczkę w swojej dokumentacji i, co ciekawsze, jaki jest problem i jak go rozwiązali.

Oto interesująca część:

Mechanika przeciągania i upuszczania w systemie Windows nie pozwala źródłowej aplikacji operacji przeciągania i upuszczania łatwo dowiedzieć się, gdzie pliki są upuszczane. Przesłanie plików do miejsca docelowego zależy od aplikacji docelowej (zwykle Eksploratora Windows). Jest to raczej rozsądne, ponieważ aplikacja źródłowa z trudem przesyła pliki do wszystkich możliwych miejsc docelowych. Pamiętaj, że możesz upuszczać pliki nie tylko do katalogu, ale nawet do pliku ZIP (lub dowolnego innego archiwum), katalogu zdalnego (przez FTP, SFTP, SCP,…), kosza,…

Oczywiście nawet Eksplorator Windows (lub dowolna inna aplikacja docelowa, taka jak WinZip) nie może pobierać plików z żadnego możliwego źródła (szczególnie nie zna SFTP / SCP).

Również specjalnie dla 7Zip: użytkownik ray023 odpowiada na to pytanie w SuperUser Stack Pytania i odpowiedzi: https://superuser.com/a/422463

Zasadniczo, jeśli zamiast przeciągania pliku skorzystasz z metody „wyodrębnij tutaj” dostępnej w bitach 7-ZIP i Winrar, pliki zostaną bezpośrednio rozpakowane do odpowiedniego katalogu.

Jalayn
źródło
2
Pytanie nie brzmiało: „Dlaczego 7zip używa plików tymczasowych?” Rzeczywiste pytanie brzmiało: „Dlaczego pliki tymczasowe są często używane w tworzeniu oprogramowania?”
Phil
@Phil Podany przykład, z tego co rozumiem, dzieje się, gdy przeciągasz jeden plik z archiwum do folderu w systemie, bez wyraźnego pytania o „wypakowanie go”. Ponownie przeczytałem pytanie i tak, myślę, że masz rację, ponieważ autor chciał dowiedzieć się więcej o użyteczności folderów tymczasowych, na które mistrzowskie odpowiedzi odpowiedziały tdammers (+1 przeze mnie również głosowało)
Jalayn
Chociaż twoja odpowiedź nie była dokładnie tym, czego szukałem, +1 za rozwiązanie mojego problemu z 7zip
Devdatta Tengshe,
1
Dobry komentarz sprowadza się do: dlaczego program używa folderu tymczasowego? Ponieważ podczas przeciągania i upuszczania nie zna folderu docelowego i po prostu „podaje go” do systemu Windows, wówczas Windows przejmuje i umieszcza plik we właściwym miejscu.
Pieter B
0

Jeśli musisz wykonać jakiekolwiek przetwarzanie danych do pliku (dekodować / przekonwertować itp.), Lepiej użyć pliku tymczasowego i po zakończeniu, i tylko po zakończeniu, przenieś wynik do ostatecznego miejsca docelowego.

Korzyści:

  1. Tylko ukończone pliki docierają do miejsca docelowego
  2. Plik tymczasowy może (powinien) znajdować się na szybkim nośniku
  3. Unikaj fragmentacji końcowego pliku
  4. Pozwala na użycie innych mediów jako miejsca docelowego (ftp, chmura, cokolwiek)
  5. Przerwane pliki tymczasowe są łatwiejsze do czyszczenia

Nie widzę prawdziwych korzyści z pisania bezpośrednio do miejsca docelowego podczas przetwarzania danych.

roetnig
źródło