Tipik sistem çağrı arabirimleri, bir dosyanın boyutunu küçültmeye izin veriyor mu (dosyayı farklı bir inode ile değiştirmeden)?


9

open()Bir dosya oluşturmanın ve küçülmesinin bir yolu var mı ? Tabii ki, onları ekleme modunda açabilir veya sonuna kadar arayabilir ve büyümelerine neden olmak için yazabilir. Ancak, bildiğim kadarıyla, tipik unix tarzı sistem çağrı arabirimleri yoluyla bir dosyayı küçültmenin bir yöntemi yoktur.

Bunu yapmanın tek yolu, bildiğim kadarıyla, yeni ve daha kısa bir dosya oluşturarak ve daha eskisinin yerine taklit rename()etmektir.

Sadece onaylamak istedim, çünkü yeni bir dosya oluşturma ve yerine yeniden adlandırma işlemi yapmak yerine doğrudan bir dosya üzerinde çalışan dosya editörleri yapmanın mümkün olduğunu ima eden bir cevap gördüm.

Her zaman libc ve unix tarzı sistem çağrısı arayüzlerindeki api dosyasının, dosya sistemlerinin uygulanmasını kolaylaştırmak ve parçalanmaya katkıda bulunabilecek kullanım kalıplarından kaçınmak için dosyaların küçülmesine izin vermediğini düşündüm.


2
fopen"W" (veya "w +") modunda bir dosyayı açmak dosyayı otomatik olarak sıfır uzunluğa indirecektir. Yoksa eski içeriğin bir kısmını korumak için sıfır olmayan bir boyuta küçültmek mi demek istediniz?
Wyzard

4
Sadece FYI open()ve openat()zaten kısaltılması için bir bayrağı var, O_TRUNCbu yüzden teknik olarak inode değiştirmeden dosyanın küçülmesine, yani tamamen küçülmesine neden oluyor. Bunun en ünlü örneği, command > file.txteğer varsa dosyanın kesileceği yerdir. Eğer çalıştırırsanız straceüzerinde bash -c 'true > /dev/null'size göreceksiniz openat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)çıktıda. Tabii ki değişken boyutta truncate()kesim için sistem aramasına ihtiyacınız var . Bunu yorum yerine gerçek bir cevap olarak istiyorsanız bana bildirin.
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy Rasgele bir boyuta küçülmeyi düşünüyordum. David Foerster'ın cevabını iptal ettim, çünkü sorunun bir alt kümesine cevap veriyor, ancak bunu icarus'un ışığında kabul etmiyorum. Bunu evet-hayır tipi bir cevap olarak kabul ederdim, oysa icarus'un cevabı gerçek cevabın "evet" olduğunu gösterdi.
JoL

Yanıtlar:


22

man -s 2 ftruncate diyor

DESCRIPTION
   The  truncate()  and  ftruncate()  functions cause the regular file
   named by path or referenced by fd to be truncated to a size of precisely
   length bytes.

...

CONFORMING TO
   POSIX.1-2001, POSIX.1-2008, 4.4BSD, SVr4 (these calls first appeared in 4.2BSD).

ftruncate kullanırsanız, dosyayı yazmak için açmış olmanız ve truncate kullanırsanız dosyanın yazılabilir olması gerektiğini söyler.


Bir dosyaya eklemek, işletim sisteminin önce truncateyeni dosya boyutuna ve ardından dosyaya uyum sağlamasına neden olur write. Yani truncatearadığınız sistem çağrısıdır.
mgarciaisaia

1
Linux'ta ayrıca bkz.fallocate(FALLOC_FL_COLLAPSE_RANGE)
Stéphane Chazelas

2

open(2)Sistem çağrısı kabul O_TRUNCdosya boyutunu azaltabilir bayrak:

O_TRUNC- Dosya mevcutsa ve normal bir dosyaysa ve dosya başarıyla açılırsa O_RDWRveya O_WRONLYuzunluğu 0'a kısaltılırsa, mod ve sahibi değiştirilmez. FIFO özel dosyaları veya terminal aygıt dosyaları üzerinde hiçbir etkisi olmayacaktır. Diğer dosya türleri üzerindeki etkisi uygulama tanımlıdır. O_TRUNCYa olmadan ya O_RDWRda olmadan kullanım sonucu O_WRONLYtanımlanmamıştır.

Program bir dosyanın içeriğinin tamamen üzerine yazmayı amaçladığında sıklıkla kullanılır. Buna bir örnek, kabuğunuzun dosya yönlendirme işlecidir command > file.

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.