Jak rozmiar pliku może wynosić zero?


173

Po prostu wpadłem na coś i nie mogłem wymyślić właściwego wyjaśnienia. Jeśli utworzę pusty plik * .txt na moim komputerze, a następnie spojrzę na jego rozmiar, wyświetli się 0. Ale jak to możliwe? To znaczy, nawet jeśli sam plik jest pusty, nadal musi mieć jakiś rozmiar, tylko po to, aby zapisać własną nazwę. Jak można to wyjaśnić? (Nie dotyczy konkretnego systemu operacyjnego)


81
nazwa pliku nie jest uwzględniana w pliku, dlatego można to wyjaśnić.
njzk2

123
Przypomina mi się znajomy z college'u, który napisał oprogramowanie do przechowywania tekstu jako nazw plików, aby obejść limit dysku.
slebetman

15
@ColeJohnson Byłem stażystą w 2000 roku w jednym z moich laboratoriów komputerowych w U, a limit użytkownika został obliczony jako suma plików. Tak więc przechowywanie danych jako nazw plików rzeczywiście obejmie qouta. Heck możesz zapisać program w folderach i nie będzie on wliczany do twojego limitu.
Mindwin

20
@slebetman To punkt, w którym zaciera się granica między geniuszem a szaleństwem.
Pharap

10
Podobna technika została słynnie zastosowana w wyzwaniu kompresji ,
Oddthinking

Odpowiedzi:


202

Jest to możliwe, ponieważ naprawdę nie ma pliku. Jest tylko wpis w katalogu z nazwą i właścicielem. Wpis katalogu jest logicznie odmienny od pliku. Na przykład ten sam plik może mieć więcej niż jedną nazwę w więcej niż jednym katalogu.

Niestety, termin „plik” nie zawsze oznacza dokładnie to samo. Ale logika rozmiaru pliku pochodzi z modelu, w którym pozycja katalogu „dołącza” plik do katalogu, a nazwy plików i powiązane metadane są przechowywane w katalogu.


30
... znany również jako Hard Links.
Daniel B

6
W katalogu. W przeciwnym razie, jeśli ten sam plik znajdowałby się w dwóch katalogach i zmieniłeś jego nazwę na jeden, to zmodyfikowałoby to inny katalog, co w ogóle nie miałoby sensu. Ponadto, gdyby tak nie było, jaka byłaby zawartość katalogu ?!
David Schwartz

14
W większości systemów typu UNIX, takich jak FreeBSD i Linux, można łatwo uzyskać rozmiar katalogu. Takie polecenia ls -ld <directory>będą działać.
David Schwartz

11
Nie wiem, czy jest to prawdą dla aktualnej wersji NTFS, ale wczesne wersje (np. W NT3.x) zapisywałyby dane dla bardzo małych plików w pozycji katalogu. Plik nie istniałby dosłownie.
John Rennie

13
Nie jest do końca prawdą, że nie ma pliku, chyba że NTFS różni się bardzo od innych systemów plików. Na zwykłym uniksowym systemie plików byłby i-węzeł przechowujący uprawnienia, czasy modów i tak dalej. Wpis katalogu nadal odnosi się do tego i-węzła. Jedyną różnicą między pustym plikiem a niepustym plikiem jest wskaźnik do przydzielania bloków. Pusty plik ma odpowiednik systemu plików wskaźnik NULL dla jego mapy blokowej, aby wskazać, że nie ma żadnych bloków danych. Wpisy katalogów nie są zaśmiecone uprawnieniami i czasami modyfikacji, nawet dla pustych plików. np. inode XFS to 256B
Peter Cordes

82

Semantyczne znaczenie „rozmiaru pliku” różni się od tego, którego używasz.

Istnieje wiele rozmiarów plików, które mają znaczenie. Najpopularniejszym i tym, który tutaj widzisz, jest „liczba bajtów w pliku”. Jeśli plik jest pustym plikiem tekstowym, może rzeczywiście zawierać 0 bajtów. Ta liczba jest ważna dla programistów, ponieważ często musimy otworzyć plik, „odczytać wszystkie dane” i zamknąć go. Musimy wiedzieć, ile bajtów danych będzie w pliku, abyśmy mogli zaplanować z wyprzedzeniem.

Inne znaczenie wynika ze sposobu przechowywania danych przez większość systemów plików. Większość systemów plików zapisuje dane w blokach. Na przykład system plików może przechowywać dane w blokach 64 kB, co oznacza, że ​​nigdy nie przydzieli niczego, co nie jest równą wielokrotnością 64 kB. Brzmi to nieefektywnie, ale może sprawić, że księgowość stanie się dużo prostsza, a często prostsza oznacza szybszą.

Trzecim znaczeniem, które szarpiesz, jest rzeczywista liczba bitów wymaganych na dysku twardym, aby opisać obecność pliku. Obejmuje to informacje, które zazwyczaj są przechowywane oddzielnie od pliku. Na przykład w Linuksie pojęcie „nazwa_pliku” jest przechowywane w i-węzle dla katalogu zawierającego plik (edycja: z komentarzy, technicznie jest to przechowywane w danych katalogu. Kiedy to napisałem, myślałem o małym -directory case Dane mniejsze niż 156 bajtów mogą być przechowywane bezpośrednio w i-węzle). Nie jest to powszechnie używane znaczenie, ponieważ niezwykle trudno jest określić bez znajomości niezwykle głębokich wewnętrznych funkcji systemu plików (czy uwzględniłeś miejsce potrzebne do przechowywania wszystkich uprawnień do pliku?). Jeśli jednak masz dysk twardy o pojemności 1 000 000 bajtów,


2
„w i-węzle dla katalogu zawierającego plik” Czy nie chodzi o dane katalogu, a nie jego i-węzeł? Węzeł zawiera rozmiary i daty plików, ale nie ma nazw ...
Medinoc

@Medinoc Dobry punkt. Myślałem o przypadku inline, kiedy zapisywał dane wewnątrz i-węzła, ale nie sprawdzałem, ile to może mieć miejsca! Dodałem edycję.
Cort Ammon

Powiązana funkcja danych wbudowanych w ext4 nie jest uniwersalna we wszystkich systemach plików. Ponadto dotyczy to i-węzła plików, a nie katalogu. Są oddzielne, katalogi mają także wbudowane funkcje danych, ale są to osobne funkcje. Węzeł plików ma ustawiony rozmiar, przynajmniej w przypadku ext4, więc użycie danych uprawnień jest nieistotne. Użycie dysku jest w dużym stopniu zależne od używanego systemu plików, trzecia część tej odpowiedzi dotyczy tylko ext4, o ile wiem, nie jest to jasne.
Phizes

8
Jeśli masz dysk twardy o pojemności 1 000 000 bajtów, nadszedł czas, aby zacząć myśleć o aktualizacji.
nekomatic

53

Nazwa pliku jest przechowywana w innym miejscu.

Twój dysk będzie miał „system plików”, po prostu metodę wyboru sposobu, w jaki nazwy plików i pliki są reprezentowane i interpretowane na dysku fizycznym.

Na większości dysków z systemem Windows używasz systemu plików o nazwie „NTFS” (New Technology File System), który przechowuje informacje o plikach w głównej tabeli plików (MFT) oddzielnie od zawartości pliku, patrz artykuł w Wikipedii na temat głównej tabeli plików .

Sam plik będzie zatem miał długość 0 bajtów, ale jego wpis w MFT nadal będzie zajmował trochę miejsca.


11
aw przypadku NTFS rozmiar pliku zgłaszanego przez Windows i większość narzędzi jest w rzeczywistości rozmiarem głównego strumienia pliku, który postrzegamy jako zawartość pliku. Plik przechowywany na partycji NTFS może dodatkowo zawierać pewne dane przechowywane w alternatywnych strumieniach danych , a nadal ma zgłaszany rozmiar 0 . To miła funkcja systemu plików, aby wiedzieć, czy chcesz mieć pełny obraz :)
Paweł Bulwan

12

To dość interesujące pytanie ontologiczne ...

Sam plik jest zawartością pliku. Jeśli plik nie zawiera treści, ma rozmiar zero. Nazwa pliku jest tak samo częścią pliku, jak twoja własna nazwa jest fizycznie częścią ciebie (tzn. Nie jest).

Tak jak twoje imię istnieje jako idea w głowach ludzi (i twoja własna), która odsyła / wskazuje na ciebie, nazwa pliku istnieje w drzewie katalogów systemu plików i odnosi się do / punktów do pliku.


7

(Trochę za późno na odpowiedź ...)

W jaki sposób plik może mieć rozmiar zero jest nieco bardziej skomplikowany niż w przypadku powyższych odpowiedzi. Pytanie jest oznaczone jako Win7, ale patrząc na inne „prostsze” systemy plików, takie jak FAT lub NTFS , może być przydatne, ponieważ koncepcje są podobne.

Dysk nie „wie”, co to jest plik i jaki jest katalog; to wszystkie dane w małych blokach. System operacyjny rozróżnia znaczenie bloków danych. Pierwsze kilka specjalnych, ale pozostałe bloki zawierają informacje o danych (np. Nazwa pliku, długość pliku, pierwszy blok danych zawierający dane) lub same dane.

Katalog jest specjalnym „plikiem”, którego „dane” rozumiane przez system operacyjny to blok informacyjny zawierający informacje o plikach, a nie o zawartości plików. Dobrą analogią jest fizyczna biblioteka i katalog kart. Pomyśl o blokach informacyjnych jako katalogu kart i półkach jako blokach danych (katalog kart również ma strukturę półkową).

Kiedy „tworzysz” plik (powiedzmy z touchpoleceniem UNIX ), system operacyjny najpierw tworzy wpis w bloku informacyjnym (katalogu), z następującym:

  • Name = My_File.txt
  • Długość = 0
  • Początkowy blok danych = N / A
  • Dodatkowe informacje (właściciel, uprawnienia, data utworzenia / aktualizacji / modyfikacji) itp

Tylko wtedy, gdy istnieją jakieś dane do „zapisu”, próbuje on znaleźć pusty blok danych do przechowywania danych. Ale bloki danych są w stałych rozmiarach (powiedzmy 32K), które są wygodne dla dysku i systemu operacyjnego do odczytu. Jeśli piszesz tylko „Hello”, większość bloku jest „pusta” (właściwie nie może być zerami, ale śmieciami z tego, co było wcześniej), więc tabela również aktualizuje rozmiar do długości (powiedzmy 5 znaków + Koniec Plik), więc nie dostaniesz złych rzeczy.

Po zaktualizowaniu rozmiaru pliku do rozmiaru bloku system operacyjny zapisuje dane w nowym bloku i aktualizuje blok danych, aby powiedzieć, że plik jest kontynuowany w następnym bloku PO pierwszej (i tak dalej), a długość jest aktualizowana. nowa długość (szczegóły różnią się).

W rezultacie otrzymujesz zbiór bloków danych informacyjnych (katalogów lub list) z informacjami o łańcuchach bloków danych (zawartość pliku).

Logicznie wyjaśnia to również, dlaczego plik przesuwa się na tym samym systemie plików szybko miga, podczas gdy kopia zajmuje dużo czasu. System operacyjny musi jedynie edytować 2 bloki katalogów, aby usunąć wpis z jednego katalogu (bloku danych informacji) i dodać go do innego. Usuń plik: po prostu usuń wpis w bloku katalogu, uwalniając bloki danych pliku do ponownego przydzielenia.

ps: Tylko dlatego, że katalog kart ma wpis do książki, nie oznacza, że ​​jest na półce (być może sprawdzony lub zagubiony); rozmiar pliku 0.

pps: źle umieszczona książka w bibliotece oznacza bibliotekę wyszukiwania lub w kategoriach komputerowych: chkdsk lub dysk naprawczy!

Lepsze zrozumienie można uzyskać, czytając o i-węzłach systemu UNIX lub doceniając, w jaki sposób systemy kontroli wersji (ClearCase, TFS, Git itp.) Zarządzają nie tylko plikami i katalogami, ale także wersjami plików, a nawet wersjami katalogów. W większości przypadków wszystko jest przechowywane w bazie danych i prezentowane użytkownikowi jako klasyczna struktura katalogów i plików!


4

Mamy tutaj kilka doskonałych odpowiedzi - dodam tylko wersję obrazu (tysiąc słów i tak dalej).

Tak wygląda jeden z moich dysków twardych w formacie NTFS, jeśli wizualizujesz go za pomocą narzędzia do defragmentacji dysku. MFT (Master File Table) ma kolor fioletowy:

wprowadź tutaj opis obrazu

Ten mały fioletowy kwadrat opisuje listę plików obecnych w moim HD. W przybliżeniu jest to, dla dysku NTFS, co spis treści jest dla książki; zamiast stron wskazuje ich fizyczną lokalizację na pozostałej części dysku 1 .

Plik o rozmiarze zero bajtów można wizualizować jako wpis spisu treści, który nie wskazuje żadnej strony:

wprowadź tutaj opis obrazu

Wpis znajduje się na liście - ale ponieważ nie wskazano żadnej strony, możemy założyć, że treść nie istnieje.

1 - Z pewnością jest to trochę bardziej skomplikowane; ale punkty takie jak mapy sektorów, lustrzane MFT itp. są poza zakresem tego pytania.


3

Systemy plików przechowują wiele informacji o pliku, takich jak nazwa pliku, rozmiar pliku, czas utworzenia, czas dostępu, czas modyfikacji, utworzony użytkownik, uprawnienia użytkownika i grupy, fragmenty, wskaźnik do klastrów przechowujących plik, twarde / miękkie łącza, atrybuty ... Nazywane są metadanymi plików . Dlaczego liczysz te metadane na rozmiar pliku, gdy użytkownicy nie muszą o nie dbać i o nich nie wiedzą? Bardzo zależy im na zawartości plików

Ponadto każdy system plików przechowuje różne typy metadanych, które zajmują różną ilość miejsca na dysku. Na przykład uprawnienia POSIX bardzo różnią się od uprawnień NTFS, inodeaw systemie POSIX są też liczby, które nie istnieją w systemie Windows. Nawet systemy plików POSIX bardzo się różnią, jak ext3 z 32-bitowym adresem bloku, ext4 z 48-bitowym, Btrfs z 64-bitowym i ZFS z 128-bitowym adresem. Jak więc policzyć te metadane do rozmiaru pliku?

Weźmy inny przykład ze 100-bajtowym plikiem, którego metadane zużywają 56 bajtów w bieżącym systemie plików. Kopiujemy plik do innego systemu plików, a teraz zajmuje on 128 bajtów metadanych. Jednak zawartość pliku jest dokładnie taka sama , liczba bajtów w plikach również jest taka sama. Zatem wyświetlanie rozmiaru pliku jako 156 bajtów w systemie, ale 228 bajtów w innym jest bardzo mylące i sprzeczne z intuicją .


1

Rozmiar pliku 0jest podobny do powiedzenia: Mam na nim papier ze 5słowami. I na innym papierze ma 0na nim słowa. Więc 0jest całkowicie możliwe.

Metadane pliku (data utworzenia, data ostatniej modyfikacji, właściciel pliku, uprawnienia) są przechowywane w innym miejscu i nie są uwzględniane jako część rozmiaru pliku.


0

Zrozum to w prosty sposób ... kiedy tworzysz plik .. generowany jest wpis katalogu, który działa jako wskaźnik lokalizacji pamięci pliku identyfikowanego przez podaną nazwę pliku. Rozmiar katalogu wzrasta wraz z tworzeniem coraz większej liczby wskaźników lub mówieniem plików ... podczas gdy rozmiar pliku zwiększa się tylko wtedy, gdy umieścisz dane SSome w wskazanym miejscu, tj. Wewnątrz samego pliku. Do tego czasu rozmiar będzie wynosił zero. :)


To jest naprawdę komentarz - nie odpowiedź - i powtarza to, co powiedzieli inni.
JakeGould

0

Tak to działa:

Po utworzeniu dowolnego pliku na woluminie tworzy rekord pliku w pliku mata NTFS, np. $ MFT (główna tabela plików). Ponieważ w MFT znajduje się FRS (segment rekordów plików), zobaczysz rekord. Każdy rekord pliku ma domyślnie rozmiar 1 KB w przypadku NTFS FileSystem. Ale ta przestrzeń jest zastrzegana tylko wtedy, gdy przechowujesz jakieś informacje wewnątrz pliku. Nawet jeśli napiszesz tylko jedną literę „a”, biorąc pod uwagę, że jest to plik tekstowy, otrzymasz 1 KB miejsca, ponieważ jest to domyślny rozmiar FRS. Litera „a” przechodzi do domyślnego i nienazwanego strumienia danych tego FRS, $ Data, który jest atrybutem, w którym przechodzą wszystkie dane, jeśli nie masz ADS (alternatywny strumień danych).

Daj mi znać, jeśli masz jakieś pytania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.