2016-09-04 27 views
5

unlink; Sadece adı ve bağlantıyı isme kaldırır. unlink geri alınabilir mi?Perl: Açıksa, bir dosya silme

open(my $fh, ">", undef) || die; 
print $fh "foo"; 
# This does not work 
link($fh,"/tmp/bar") || die; 

Açık olmayan bir dosyaya açık dosya tanıtıcısı bir dosyaya bağlanabilir mi?

cevap

0

Bu cevaplar ki: 'Hayır, genel olarak ve kesinlikle hepsi değil Unix'lerde':

https://serverfault.com/questions/168909/relinking-a-deleted-file

Relinking an anonymous (unlinked but open) file

çalışabilir açık dosya tanıtıcısından içeriği kopyalanıyor.

+0

Tamamen katılıyorum, bunun için bir imkan yok ve _in general_. Bir şeyleri kaçırıp kaçırmadığımı merak ediyorum, neden "_açık dosya kütüğünden gelen içeriği açabilir ** may ** work._" (benimki)? Gönderdiğim dosya (rw) açıldığı sürece çalışır (veya - nasıl olmaz?). (Elbette orijinal bağlantıyı geri yüklemez.) – zdim

+0

Yeniden bağlama işleminin nedeni, dosyayı yeniden okumayı engellemekse (burada benim durumumda), kopyalama içeriği çalışmaz. –

+0

Ah, tamam. Bunun bir amaç olduğunu anlayamadım. – zdim

3

Mümkünse, açık modunu ('>') okumak/yazmak yerine değiştirebilirsiniz. Ardından, dosyayı kurtarmanız gerektiğinde, gerektiğinde aynı ada sahip olsa bile, yeni açılan bir dosyaya yazdırmak için filehandle'ı kullanabilirsiniz.

open my $fh, '+>', $file; 
say $fh "line 1"; 
unlink $file; 
say $fh "more lines"; 

seek $fh, 0, 0; 
open my $fh_rec, '>', $file or die "Can't open $file (again): $!"; 
print $fh_rec $_ while <$fh>; 

Bu sorulur tam olarak ne değil ama dosya içeriğini ve buna erişimi kurtarır. $fh numaralı yeni baskılar yeni $file senkronizasyon dışında bırakılır, bu nedenle yazma işlemi bittiğinde (dosyayı geri yüklemek için) veya baskıyı $fh_rec (daha sonra close $fh) olarak değiştirmek için yapılabilir. o /proc kullanır ve dosya kolları maruz bırakması halinde


bir dosyayı kurtarmak için başka bir yol, OS kullanmaktır. Daha sonra veriler /proc/PID/fd/N'dan kopyalanabilir. N'u tanımlamak için, fd/ (bir kaç) ls -l ile olan tüm bağlantıları tarayabilirsiniz, çünkü silinen dosyanın adı sonra (deleted) olmalıdır.

Ayrıca, lsof -p PID verilen işlem için tüm açık dosya tanımlayıcılarını listeler. Silinen dosyalar için onlarla (deleted) var. (lsof +L1 -p PID sadece silinmiş girişleri verir, hala oldukça az.) Bu çıkıştan bu dosya tanımlayıcısını okuyabilir ve daha sonra verileri /proc/PID/fd/N'dan kopyalayabiliriz. Bu şekilde, aynı zamanda, dosyayı kurtarmak için de kullanılabilen inode numarasını elde ederiz.