Geçici bir yere yazmanın ve ardından istediğiniz yere kopyalamanın faydası nedir?


47

Uydu görüntüleriyle çalışan bir uygulama yazıyorum ve patronum bazı ticari uygulamalara bakmamı ve nasıl davrandıklarını görmemi istedi. Garip bir davranış buldum ve o sırada bakarken diğer standart uygulamalarda da buldum.

Bu programlar önce temp klasörüne yazılır ve sonra istenen hedefe kopyalanır.

Örnek: 7zip, önce temp klasörüne ayıklar ve sonra ayıklanan verileri, ayıklamasını istediğiniz yere kopyalar.

Bu yaklaşımla ilgili birkaç problem görüyorum:

  1. Temp klasörü yeteri kadar boş alana sahip olmayabilir, amaçlanan konum ise bu kadar boş alana sahip olabilir.

  2. Büyük bir dosya ise, kopyalama işlemi için önemsiz miktarda zaman alabilir.

Çok düşündüm, ama bunu yapmak için tek bir olumlu nokta göremedim. Bir şey mi eksik veya bunu yapmanın gerçek bir faydası var mı?


Uygulama gerektiriyorsa yapın. Aksi takdirde, mantıklı olanı yapın. Beynin sana bu durumda gerekli olmadığını söylüyor. Cevabımla söyleyebileceğiniz gibi mümkün olan en az miktarda iş yapma kampındayım, bu yüzden uygulama için mümkün olan en az miktarda çalışmanızı öneririm.
Jason Sebring,

1
Dosyayı “kopyaladığından” ve “taşımayacağından” emin misiniz? Büyük fark.
frankc

Gönderen blogs.rsa.com/... , malwares için, avantaj 1) Garantili yazılabilirlik önler "kırmızı hata" algılama hatta tamamen kullanıcının bilgisayarına üzerine virüsü indirdikten önce 2) TEMP diskler genellikle daha hızlıdır (RAMDisk) süresini azaltarak virüs hala indirme aşamasındayken algılama (virüs tamamen kurulduktan ve 0.05 saniye boyunca çalıştırıldıktan sonra oyun bitti, bu yüzden bir zaman yarışı)
Pacerier

3) Hala yüklerken veya çalışıyorken, bir virüsten koruma yazılımı size zarar verdiyse (bazen bilmeden, bazen de) ve kemiklerinizi etrafta bırakmışsa, işletim sisteminin veya kullanıcının yanlışlıkla silmenize yardımcı olabileceği% x şansına güvenebilirsiniz Ölü kemikleriniz TEMP klasöründeki maddeleri toplu halde temizlerken, algılama olasılığını azaltmaya yardımcı olur.
Pacerier

Yanıtlar:


95

Düşünebilmemin birkaç nedeni:

  • Çoğu platformda, dosya taşıma işlemleri atomiktir, ancak dosya yazarları değildir (özellikle tüm verileri tek seferde yazamıyorsanız). Bu nedenle, tipik bir üretici / tüketici modeline sahipseniz (bir işlem dosyaları üretir, diğeri bir dizini izler ve bulduğu her şeyi alır), önce geçici bir klasöre yazma, sonra yalnızca gerçek yere taşınması, tüketicinin asla göremeyeceği anlamına gelir bitmemiş dosya.
  • Dosyayı yazan işlem yarıda sona ererse, diskinizde bozuk bir dosya vardır. Gerçek bir yerde ise, kendiniz temizlemeniz gerekir, ancak geçici bir konumda ise işletim sistemi ilgilenir.
  • Bir yedekleme işi çalışırken dosya oluşturulursa, iş eksik bir dosyayı alabilir; geçici dizinler genellikle yedeklemelerin dışında tutulur, bu nedenle dosya yalnızca son hedefine taşındıktan sonra dahil edilir.
  • Temp dizini, aynı dosyanın birkaç parçasını paralel olarak indirmek veya dosya üzerinde yerinde bir sürü işlem yapmak gibi işlemler için faydalı olabilecek hızlı ancak geçici bir dosya sisteminde (örn. Bir ramdisk) olabilir. Ayrıca, geçici dizinler, daha az sıklıkla okunan, yazılan ve silinen dizinlerden daha fazla parçalanmaya neden olma eğilimindedir ve geçici dizini ayrı bir bölümde tutmak, diğer bölümlerin parçalanmasını önlemeye yardımcı olabilir.

TL; DR - çoğunlukla atomize kaynar, yani (nihai yerde) dosyanın herhangi bir zamanda orada ya da hiç olmadığından emin olmak istersiniz.


12
Temp dizini ayrı bir bölümdeyse, atomluğu kaybedersiniz.
yfeldblum

16
Bazı programlar istenen dizine kopyalanacak / kopyalanacak, ancak geçici bir dosya uzantısı (örn. .Tmp) kullanacak ve tamamlandıktan sonra yeniden adlandıracaklar.
Dan Diplo,

5
Bazen geçici bir dosyaya yazma, programınızın birkaç örneği aynı anda aynı dosyayı yüklemeyi deneyebildiğinde ve doğru kilitleme düzeyini sağlamak için dosya sistemine güvenemezsiniz (kötü tanımlanmış bulut depolama API'si gibi) . Temp dosyasını kullanmak, ortaya çıkan dosyanın, her iki yüklemeden de bir veri karışımı ile sonuçlanmayacağından emin olacaktır. Tabii ki bu sadece başka bir atomiklik örneği.
Krzysztof Kozielczyk

1
Dan Diplo davası, mevcut bir dosyayı güncellerken kullanışlıdır. Yenisini başarılı bir şekilde yazana kadar eskisini değiştirmek istemezsiniz, yenisinin yazması başarısız olsun ya da tamamen yazılmadan önce yenisini okuyun.
RalphChapin

1
Ne yazık ki, işletim sistemi temizlemiyor çünkü OS Temp klasörler eski dosyalar ve klasörler ile bilmeceli olsa! Bu yüzden geliştiriciler olarak hala temizlemeliyiz! superuser.com/questions/296824/…
markmnl

15

Bu, Windows'ta, daha özel olarak, sürükle bırak işleminin nasıl yönetildiği ile ilgili bir sorun gibi görünüyor.

Geliştiricileri WinSCP istemcisi bu sürükle-bırak davranışı geçersiz kılar ve hemen sağ klasöre bırakarak verir kendi kabuk uzantısı, geliştirdik. Numarayı belgelerinde açıklıyorlar ve daha ilginç olarak, sorunun ne olduğunu ve nasıl çözdüklerini açıklıyorlar.

İşte ilginç kısım:

Windows sürükle ve bırak teknisyeni, dosyaların bırakıldığı yerde sürükle bırak işleminin kaynak uygulamasının kolayca bulunmasına izin vermez. Dosyaları hedefe aktarmak, hedef uygulamaya bağlıdır (genellikle Windows Gezgini). Bu oldukça mantıklı, çünkü kaynak uygulama dosyaları mümkün olan tüm varış noktalarına transfer edemiyor. Dosyaları yalnızca bir dizine değil, ZIP dosyasına (veya başka bir arşive), uzak dizine (FTP, SFTP, SCP,…), çöp kutusuna,…

Açıkçası, Windows Gezgini (veya WinZip gibi başka bir hedef uygulama) bile herhangi bir olası kaynaktan dosya indiremiyor (özellikle SFTP / SCP bilmiyor).

Ayrıca, özellikle 7Zip için: user ray023 bu soruyu Süper Kullanıcı Yığın Soru-Cevap bölümünde yanıtlar: https://superuser.com/a/422463

Temel olarak, dosyanızı sürükleyip bırakmak yerine 7-ZIP ve Winrar bith işlevinde bulunan "buraya ayıkla" yöntemini kullanırsanız, dosyalar doğrudan doğrudan doğru dizinedir.


2
Soru "Neden 7zip geçici dosyaları kullanıyor?" Asıl soru "Neden geçici dosyalar yazılım geliştirmede yaygın olarak kullanılıyor?"
Phil

@Phil Verilen örnek, anladığım kadarıyla, bir dosyayı bir arşivden sistemdeki bir klasöre sürüklediğinizde, açıkça "ayıklamak" istemeden ne olduğudur. Yine de, soruyu tekrar okudum ve evet, yazarın geçici klasörlerin kullanımı hakkında daha fazla bilgi edinmek istediğine inanıyorum, bu arada tdammers tarafından ustaca cevaplandı (+1 de bana oy verdi)
Jalayn

Cevabınız tam olarak aradığım şey değildi, +1, 7zip ile
sorunumu çözdüğüm için

1
İyi yorum, temel olarak aşağı kaymaktadır: bir program neden temp klasörü kullanıyor? Çünkü sürükle ve bırak işlemi hedef klasörü bilmediğinden ve sadece pencerelere "verdiğinden" sonra, pencereler devralır ve dosyayı doğru yere koyar.
Pieter B

0

Dosyaya herhangi bir veri işleme işlemi yapmanız gerekiyorsa (decode / convert / etc ..), geçici bir dosya kullanmak ve tamamlandığında ve yalnızca tamamlandığında sonucu son hedefe aktarmak daha iyidir.

Yararları:

  1. Yalnızca tamamlanan dosyalar hedefe ulaşıyor
  2. Geçici dosya hızlı medyada bulunabilir (gerekir)
  3. Son dosyada parçalanmaktan kaçının
  4. Nihai hedef olarak başka medyanın kullanılmasına izin verir (ftp, bulut, her neyse)
  5. İptal edilen geçici dosyaların temizlenmesi daha kolaydır

Verileri işlerken doğrudan hedefe yazmanın gerçek faydalarını göremiyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.