Bir dosya kopyalanırken değiştirilirse ne olur?


19

Bir dosyayı kopyalamanın etkisi B dosyası (location.big) 'den locationC (dosya)' a (900mb) diyelim. Bu cp işlemi sırasında, süreç boyunca% 35 diyelim, fileA.big'e yeni bilgiler eklenir ve 900mb'den 930mb'ye çıkar.

Son kopyanın sonucu nedir (yani locationC'deki fileA.big)?

Kopya yaklaşık% 70 ise ve orijinal dosya güncellenir, ancak bu sefer 400mb'ye kesilirse (yani kopyanın ilerlemesi kesme noktasının ötesindeyse), son kopyanın sonucu nedir?

Ext3 / ext4 dosya sistemindeki bir linux işletim sistemine başvurmak. Hiçbir hacim gölge büyü vb .. Sadece düz eski cp. Merak, canlı couchdb dosyalarını yedekleme için kopyalayarak ortaya çıktı, ancak belirli kullanım durumlarından ziyade genel senaryolarla daha fazla ilgileniyor.


Bunu sorduğun için teşekkürler. Benim 'bilgim' çoğunlukla bir tahmindi ... şimdiye kadar.
tshepang

Yanıtlar:


10

Eğer fileA.bigkopyalama sırasında yetiştirilir, kopya ekinde verileri içerir.

Dosya, kopyanın şu anda bulunduğu yerden daha kısa kesilirse, kopya tam konumunda olduğu yerde iptal edilir ve hedef dosya, kopyalandığı zamana kadar kopyalananı içerir.


27

Patrick az ya da çok doğru, ama nedeni bu. UNIX altında bir dosyayı kopyalama şekliniz şöyle çalışır:

  1. Bazı (daha fazla) bayt okumayı deneyin fileA.
  2. Dosyanın sonunda olduğumuzdan (veya geçtiğimizden) bayt alamadıysak işimiz bitti; çıkın.
  3. Aksi takdirde, baytları yazın fileBve 1. adıma geri dönün.

Bunu bilmek ve bunun kadar basit olduğunu bilmek, bazı köşe vakalarını görmemizi sağlar.

Dosyanın sonunu bulur bulmaz kopyalama yapılır. Diyelim ki dosyamız kopyalama sırasında büyüyor, ama kopyaladığımızdan daha yavaş büyüyor. Kopyalama programı orijinal dosya boyutunu geçmeye devam edecektir, çünkü oraya ulaştığında dosyada daha fazlası vardır. Ancak bir noktada, dosyanın sonuna yetişir ve sonunda olduğunu bilir çünkü şu anda daha fazla bayt okuyamaz . Bu yüzden, dosya daha da büyümek üzere olsa bile, tam orada kapanıyor.

Dosya kesilirse, kopyalama programı "Whoa, dosyanın sonunu geçtim!" ve çıkar.

Ve eğer bir veritabanı programı :-) tarafından dosya parçaları rastgele güncelleniyorsa, o zaman kopyanız eski ve yeni verilerin bir karışımı olacaktır, çünkü verilerin hepsi aynı anda kopyalanmaz. Sonuç muhtemelen bozuk bir kopya olacaktır, bu yüzden canlı veritabanlarının kopyalarını oluşturmak genellikle iyi bir fikir değildir.

(Bu, CouchDB'ye aşina olmadığımı söyledi ve bu tür yolsuzluklara karşı dirençli bir veritabanı tasarlamak mümkün. Ama kesinlikle en iyisi.)


İyi açıklama. BTW, bu, Windows'tan bilinen tipik bir hata mesajı almadan (UNIX benzeri işletim sistemleri altında bunun neden mümkün olduğunu her zaman beni şaşırttı ("Dosyaya erişilemiyor - kullanılan dosya")) Daha önce silinmiş bir MP3 dosyasını bile çalamıyorsunuz ederken oynamaya. Unix altında, (şaşırtıcı bir şekilde) yapabilirsiniz - hiç problem olmadan. UNIX tabanlı işletim sistemlerinin her zaman dosyaların yedek kopyalarıyla çalıştığını düşünüyorum, bu yüzden bu mümkün.
sözdizimi

1
Aslında, silinen bir dosyayı okuyabilmek farklı bir UNIX özelliğinden gelir: UNIX altında dosyalar ve dosya adları farklı şeylerdir. Bir dosyayı sildiğinizde, gerçekte yaptığınız şey dosyaya adlandırılmış bir "bağlantıyı" silmektir. Bir program bir dosyayı açtığında, bu bağlantı olarak da sayılır. Sistem yalnızca bağlantı kalmamışsa dosyanın kendisini siler.
Jander

Dosya kopyalayabildiğimizden daha hızlı büyürse, cp asla sonlandırılmayacak mı? Dosyaya ne yazıyorsa, dosyaya yazmak için cp'nin okuyabildiğinden daha hızlı olması gerektiğinin farkında değilim.
Bladt
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.