2009-04-30 30 views
12

Birisi bir linux sunucusundaki klasöre 10Mb boyutundaki bir dosyaya FTP atıyor. Dosya geçiş halindeyken, bir cron uyandırır ve ftp klasörüne bakacak ve orada bulduğu her şeyi başka bir klasöre taşıyacak şekilde tasarlanmış bir Perl betiğini kapatır. File::Copy'dan move() işlevini kullanıyorum. Perl süreci aslında dosyaları görevinin bir parçası olarak yeniden adlandırır. Bu sorun mu, yoksa dosya sistemi dosya olarak neyi tanıması FTP'yi umursamıyor mu?Perl, karşıya yüklenen bir dosyada move() öğesini çağırmaya çalışırsa ne olur?

move() başarılı ve ne yapacağını FTP bırakarak kısmi dosya taşımak olacak mı? Ya da başarısızlık hareket eder ve 0 döndürür?

+0

sayesinde sorumu kadar oylama için! :) Windows IMHO'nun aksine Linux'un en büyük özelliklerinden biri olan –

+3

, taşıma, yeniden adlandırma, hatta silme gibi dosyaları açmak için açık bir şeyler yapabileceğiniz ve onları açık olan uygulamaların habersiz olacağıdır. Çalıştırırken programları bile silebilir ve iyi çalışmaya devam ederler (ancak çıktıktan sonra, onları asla geri alamazsınız ...) – rmeador

+0

Hareket() nedir ve şeyleri nereye taşıyor? Dosyalarını kopyalamak yerine dosyaları kopyalamak mı gerekiyor? –

cevap

10

Hayır, taşımak sadece yeni pozisyona indirme işlemini tamamlamak izin vermelisiniz. Sadece inode'u bir konumdan diğerine taşıyorsunuz. İndirme programından açık dosya tanıtıcısı hala işaret etmelidir.

Sadece birkaç başka sözü tekrarlamak istiyorum. Bu sadece taşıma işlemi aynı dosya sisteminde olduğu sürece çalışır. Her zaman aynı dosya sistemine ait olduğu için inode'dan başka bir dosya sistemi aktarılamazsa aktarılamaz. Muhtemelen senaryo, o andaki kısmi verinin yeni yere kopyalanması, program hala eski bir dosyaya yüklenmemiş eski bir inodeda indirilmesi ve bu yüzden kullanılamaz olmasıdır.

+1

Önemli değil. Dosya sisteminde isim, inode ile ilişkilendirilir. Taşıma ve yeniden adlandırma, sorunuzla hemen hemen aynı. Eski dosya adı ile yeni bir dosya sadece başka bir inode içerecektir ve sorunlu değildir. Sadece bu durumda bir sonraki sorusu olurdu :) –

+2

Caveat: dosya sistemlerinde hareket ederseniz, yükleme bitecek, ancak inode için herhangi bir referans olmayacağı için dosyaya ulaşamayacaksınız. Diğer dosya sistemindeki kısmi bir dosyayla sonuçlanacaksınız. –

1

Emin değilim, ama büyük olasılıkla yanlış hiçbir şey olmaz. Taşıma işlemi, inode numarasını değiştirmez, böylece FTP sunucusu hiç hareket etmeyecek ve yeni konumda dosyaya yazmaya devam edecektir. Kısa bir süre için move() başarılı olacak ve yükleme yeni konumda devam edecek. Hiçbir standart move olmadığı

5

, bu senaryoda neler olduğunu bilmek zor. Eğer rename kastettiyseniz, muhtemelen herhangi bir sorun yaşamayacaksınız, çünkü durumunuzun yanlış gitmesinin ana yolu, dosyayı bir dosya sisteminden diğerine taşıyor olmanızdır (bu nedenle bir kopyalama-silme işlemi yapmak değil). gerçek hareket) ve çoğu sistemde rename bu koşullar altında başarısız olur. (Kurulumunuz her şey yolunda giderse, her şey yoluna girecektir.)

rename'u kullanmıyorsanız, ancak bazı move işlevini kullanıyorsanız, örneğin, dosya sistemlerinde hareket etmeyi başarabilirsiniz; Birden fazla dosya sistemi varsa kısmi bir dosya. (Bu, eğer şimdi tek bir dosya sistemindesiniz, ama daha sonra yüklediğiniz bu dosyalarda çok fazla yer kaplıyorsanız ve bunları depolamaya adanmış bir sürücüye eklerseniz, bu çok kötü bir istekliliğe dönüşebilir. ve şimdi bir çapraz dosya sistemi hareket yapıyoruz.)

+0

Ben sadece bir sarıcı olduğunu düşünüyorum perl hareket fonksiyonu kullanıyorum> mv -src -dest Özellikle kod hareket ("$ ftpDir $ inFile", "$ someOtherDir $ newFileName"); –

+2

Sistem/bin/mv etrafındaki sarıcıysa, kısmi dosyalar için tehlike altındasınız, * ve sadece eğer * dosya sistemlerinde (şimdi veya gelecekte) hareket ediyorsanız. – chaos

+0

Ancak dosya sistemi aynı olduğu sürece, hiçbir zararın olmadığını kabul ediyor musunuz? –