Czy istnieje sposób na open()
plik i spowodować jego zmniejszenie? Oczywiście można je otwierać w trybie dołączania lub szukać do końca i pisać, aby spowodować ich wzrost. Jednak, o ile mi wiadomo, nie ma metody zmniejszania pliku za pomocą typowych interfejsów wywołań systemowych w stylu uniksowym.
O ile mi wiadomo, jedynym sposobem na zrobienie tego jest sfałszowanie go przez utworzenie nowego krótszego pliku i zastąpienie go rename()
starszym.
Chciałem tylko potwierdzenia, ponieważ zobaczyłem odpowiedź, która sugerowała, że można było utworzyć edytory plików, które działały bezpośrednio na pliku, zamiast przechodzić proces tworzenia nowego i zmiany jego nazwy.
Zawsze myślałem, że interfejs plików w interfejsach wywołań systemowych w stylu libc i unix nie pozwala na zmniejszanie plików w celu ułatwienia implementacji systemów plików i może uniknąć wzorców użytkowania, które mogłyby przyczynić się do fragmentacji.
źródło
fopen
w trybie „w” (lub „w +”) spowoduje automatyczne obcięcie go do zera. A może masz na myśli zmniejszenie się do zera, aby zachować część starej zawartości?open()
aopenat()
już masz flagę do obcinania,O_TRUNC
więc technicznie powoduje to, że plik się zmniejsza - to znaczy całkowicie się zmniejsza - bez zmiany i-węzła. Najbardziej znanym przykładem jest tocommand > file.txt
, że plik zostanie obcięty, jeśli istnieje. Po uruchomieniustrace
nabash -c 'true > /dev/null'
zobaczyszopenat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)
na wyjściu. Oczywiście dla zmiennej wielkości obcięcia potrzebujesztruncate()
syscall. Daj mi znać, jeśli chcesz to jako rzeczywistą odpowiedź zamiast komentarza.Odpowiedzi:
man -s 2 ftruncate
mówi...
mówi dalej, że jeśli używasz ftruncate, musisz otworzyć plik do zapisu, a jeśli używasz skrótu, plik musi być zapisywalny.
źródło
truncate
dostosowuje go do nowego rozmiaru pliku, a następniewrite
go. Podobnietruncate
jest szukane połączenie systemowe.fallocate(FALLOC_FL_COLLAPSE_RANGE)
open(2)
Wywołanie systemowe akceptujeO_TRUNC
flagi, które mogą zmniejszyć rozmiar pliku:Jest często używany, gdy program ma na celu całkowite zastąpienie zawartości pliku. Przykładem jest operator przekierowania plików powłoki jak w
command > file
.źródło