Come può una dimensione del file essere zero?


173

Solo qualcosa in cui mi sono imbattuto e non riuscivo a pensare a una spiegazione adeguata. Se creo un file * .txt vuoto sul mio PC e poi guardo le sue dimensioni, viene visualizzato 0. Ma come è possibile? Voglio dire anche se il file stesso è vuoto, deve comunque avere delle dimensioni, solo per memorizzare il proprio nome. Come può essere spiegato? (Non specifico del sistema operativo)


81
il nome del file non conta nel file, che come può essere spiegato.
njzk2,

123
Mi viene in mente un amico del college che ha scritto un software per memorizzare il testo come nomi di file per aggirare la quota del disco.
Slebetman,

15
@ColeJohnson Ero un tirocinante negli anni 2000 in uno dei laboratori informatici della mia U e la quota utente è stata calcolata come somma delle dimensioni dei file. Quindi l'archiviazione dei dati come nomi di file aggirerebbe davvero qouta. Diamine, potresti salvare un programma in cartelle e non conterebbe per la tua quota.
Mindwin,

20
@slebetman Questo è il punto in cui il confine tra genio e follia si confonde.
Pharap,

10
Una tecnica simile fu notoriamente usata in una sfida di compressione ,
Oddthinking,

Risposte:


202

È possibile perché non esiste davvero alcun file. C'è solo una voce della directory con un nome e un proprietario. La voce della directory è logicamente distinta dal file. Ad esempio, lo stesso file può avere più di un nome in più di una directory.

Sfortunatamente, il termine "file" non è sempre usato per indicare esattamente la stessa cosa. Ma la logica delle dimensioni del file proviene dal modello in cui una voce di directory "allega" un file a una directory e i nomi dei file e i relativi metadati sono memorizzati nella directory.


30
... noto anche come Hard Links.
Daniel B,

6
Nella directory. Altrimenti, se lo stesso file fosse in due directory e tu lo rinominassi in una, questo cambierebbe l'altra directory, il che non avrebbe alcun senso. Inoltre, se non fosse così, quale sarebbe il contenuto di una directory ?!
David Schwartz,

14
Sulla maggior parte dei SO simili a UNIX, come FreeBSD e Linux, puoi facilmente ottenere le dimensioni di una directory. I comandi come ls -ld <directory>funzioneranno.
David Schwartz,

11
Non so se questo sia vero per l'attuale versione di NTFS, ma le prime versioni (ad esempio su NT3.x) memorizzerebbero i dati per file molto piccoli nella voce della directory. Il file non esisterebbe letteralmente.
John Rennie,

13
Non è del tutto vero che non esiste alcun file, a meno che NTFS non sia molto diverso dagli altri filesystem. Su un normale filesystem Unix, ci sarebbe un inode che memorizza i permessi, i mod-time e così via. La voce della directory fa ancora riferimento a questo inode. L'unica differenza tra un file vuoto e un file non vuoto è il puntatore per allocare i blocchi. Un file vuoto ha l'equivalente del filesystem di un puntatore NULL per la sua mappa di blocco, tuttavia, per indicare che non ha blocchi di dati. Le voci della directory non sono ingombra di autorizzazioni e tempi di modifica, anche per file vuoti. ad es. gli inode XFS sono 256B
Peter Cordes,

82

Il significato semantico di "dimensione del file" è diverso da quello in uso.

Ci sono molte dimensioni di file che sono significative. Il più comune e quello che vedi qui è "il numero di byte nel file". Se il file è un file di testo vuoto, può effettivamente contenere 0 byte. Questo numero è importante per i programmatori perché spesso abbiamo bisogno di aprire un file, "leggere tutti i dati" e chiuderlo. Dobbiamo sapere quanti byte di dati saranno presenti nel file in modo da poter pianificare in anticipo.

Un altro significato deriva dal modo in cui la maggior parte dei file system memorizza i dati. La maggior parte dei file system memorizza i dati in blocchi. Ad esempio, il file system può archiviare i dati in blocchi da 64 kB, il che significa che non assegnerà mai nulla che non sia un multiplo pari di 64 kB. Sembra inefficiente, ma può rendere la contabilità molto più semplice e spesso più semplice significa più velocemente.

Un terzo significato, che stai cercando, sarebbe il numero effettivo di bit richiesti sul disco rigido per descrivere la presenza di un file. Ciò include le informazioni che di solito sono memorizzate separatamente dal file. Ad esempio, in Linux, il concetto di "nome file" è memorizzato nell'inode per la directory contenente il file (modifica: dai commenti, tecnicamente questo è archiviato nei dati della directory. Quando ho scritto questo, stavo pensando al piccolo -directory case: i dati inferiori a 156 byte possono essere memorizzati direttamente nell'inode). Questo non è un significato comunemente usato, perché è terribilmente difficile da determinare senza conoscere i meccanismi interni tremendamente profondi del tuo file system (hai tenuto conto dello spazio necessario per archiviare tutte le autorizzazioni sul file?). Tuttavia, se si dispone di un disco rigido da 1.000.000 byte,


2
"nell'inode per la directory contenente il file" Non intendi i dati della directory, piuttosto che il suo inode? L'inode contiene dimensioni e date dei file, ma nessun nome ...
Medinoc,

@Medinoc Un buon punto. Stavo pensando al caso inline quando ha archiviato i dati all'interno dell'inode, ma in realtà non ho verificato quanto potesse accadere! Ho aggiunto una modifica.
Cort Ammon,

Funzionalità di dati inline correlati di ext4, questo non è affatto universale in tutti i filesystem. Inoltre, questo vale per l'inode dei file, non per la directory. Sono separati, le directory hanno anche una capacità di dati in linea, ma sono funzionalità separate. Un inode di file ha una dimensione impostata, almeno nel caso di ext4, quindi l'utilizzo dei dati delle autorizzazioni è irrilevante. L'utilizzo di un disco di file dipende fortemente dal filesystem in uso, la terza parte di questa risposta si applica solo a ext4, per quanto ne so, questo non è chiarito.
Phizes,

8
Se si dispone di un disco rigido da 1.000.000 di byte, potrebbe essere il momento di iniziare a pensare a un aggiornamento.
Nekomatic

53

Il nome del file è memorizzato altrove.

Il tuo disco avrà un "file system" su di esso, semplicemente un metodo per scegliere come i nomi dei file e i file sono rappresentati e interpretati sul disco fisico.

Sulla maggior parte dei dischi di Windows utilizzerai un file system chiamato "NTFS" (New Technology File System "), che memorizza le informazioni sul nome file nella Tabella file principale (MFT) separatamente dal contenuto del file. Vedi l' articolo di Wikipedia sulla Tabella file principale .

Il file stesso avrà pertanto una lunghezza di 0 byte, ma la sua voce nella MFT occuperà comunque dello spazio.


11
e nel caso di NTFS, la dimensione del file riportata da Windows e dalla maggior parte degli strumenti è in realtà la dimensione del flusso principale del file, che percepiamo come il contenuto del file. Il file archiviato sulla partizione NTFS può inoltre contenere alcuni dati archiviati in flussi di dati alternativi e avere comunque la dimensione riportata di 0 . È una bella funzionalità del filesystem per sapere se vuoi avere un quadro completo :)
Paweł Bulwan

12

Questa è una domanda ontologica piuttosto interessante ...

Il file stesso è il contenuto del file. Se il file non ha contenuto, ha una dimensione pari a zero. Il nome del file è tanto una parte del file quanto il tuo nome è fisicamente una parte di te (cioè non lo è).

Proprio come il tuo nome esiste come un'idea nella testa delle persone (e la tua) che fa riferimento / punta al tuo fisico, il nome del file esiste nella struttura di directory del file system e fa riferimento / punta al file.


7

(Un po 'in ritardo alla risposta ...)

Come può un file avere dimensioni zero è un po 'più complicato di quanto fornito dalle risposte sopra. La domanda è contrassegnata con Win7, ma guardare altri file system "più semplici" come FAT o NTFS , può essere utile in quanto i concetti sono simili.

Il disco non "conosce" cos'è un file e cos'è una directory; sono tutti dati in piccoli blocchi. Il sistema operativo distingue tra significato dei blocchi di dati. I primi sono speciali, ma il resto dei blocchi contiene informazioni sui dati (ad esempio: nome del file, lunghezza del file, primo blocco di dati che contiene i dati) o i dati stessi.

Una directory è un "file" speciale i cui "dati" sono compresi dal sistema operativo è un blocco di informazioni contenente informazioni sui file, non il contenuto dei file. Una buona analogia è una biblioteca fisica e il catalogo delle carte. Pensa ai blocchi di informazioni come al catalogo delle carte e agli scaffali come ai blocchi di dati (il catalogo delle carte si trova anche su una struttura a mensola).

Quando si "crea" un file (ad esempio con il touchcomando UNIX ), il sistema operativo crea innanzitutto una voce in un blocco di informazioni (directory), con il seguente:

  • Nome = My_File.txt
  • Lunghezza = 0
  • Blocco dati di partenza = N / A
  • Informazioni aggiuntive (proprietario, autorizzazioni, data di creazione / aggiornamento / modifica), ecc

Solo se ci sono alcuni dati da "scrivere", tenta di trovare un blocco di dati vuoto per memorizzare i dati. Ma i blocchi di dati sono disponibili in dimensioni fisse (diciamo 32K), convenienti per il disco e per il sistema operativo da leggere. Se scrivi solo "Ciao", la maggior parte del blocco è "vuota" (in realtà potrebbe non essere zero, ma immondizia da ciò che c'era prima), quindi la tabella ora aggiorna anche la dimensione alla lunghezza (diciamo 5 caratteri + Fine di File) in modo da non ottenere le cose cattive.

Quando aggiorni il "file" ad una lunghezza> dimensione del blocco, il sistema operativo scrive i dati nel nuovo blocco e aggiorna un blocco di dati per dire che il file continua sul blocco successivo DOPO il primo (e così via) e la lunghezza viene aggiornata nuova lunghezza (i dettagli differiscono).

Ciò che si ottiene è una raccolta di blocchi di dati (directory o elenchi) con informazioni sulle catene di blocchi di dati (contenuto del file).

Logicamente, questo spiega anche perché uno spostamento di file sullo stesso filesystem lampeggia velocemente mentre una copia impiega molto tempo. Il sistema operativo deve solo modificare 2 blocchi di directory per rimuovere la voce da una directory (blocco di informazioni) e aggiungerla a un'altra. Elimina un file: basta rimuovere la voce nel blocco directory, liberando i blocchi di dati del file da riallocare.

ps: Solo perché il catalogo delle carte ha l'iscrizione per un libro non significa che sia sullo scaffale (estratto o forse perso); dimensione del file 0.

pps: un libro fuori posto all'interno della libreria implica una libreria di ricerca, o in termini di computer: chkdsk o ripara disco!

Una maggiore comprensione può essere ottenuta leggendo sugli inode UNIX o apprezzando il modo in cui i sistemi di controllo versione (ClearCase, TFS, Git, ecc.) Gestiscono non solo i file e le directory, ma anche le versioni dei file e persino le versioni delle directory. Nella maggior parte dei casi, tutto viene archiviato in un database e presentato all'utente per apparire come una struttura e file di directory classici!


4

Abbiamo qui delle risposte eccellenti: aggiungerei solo la versione dell'immagine (mille parole e tutto il resto).

Ecco come appare uno dei miei dischi rigidi formattati NTFS se lo si visualizza con uno strumento di deframmentazione del disco. La MFT (Master File Table) è mostrata in viola:

inserisci qui la descrizione dell'immagine

Quel quadratino viola descrive l'elenco dei file presenti nel mio HD. In parole povere è, per un disco NTFS, ciò che il Sommario è per un libro; invece delle pagine, indica la loro posizione fisica sul resto del disco 1 .

Un file con una dimensione di zero byte può essere visualizzato come una voce del sommario che punta a nessuna pagina:

inserisci qui la descrizione dell'immagine

La voce è lì, elencata - ma poiché nessuna pagina è indicata, possiamo presumere che il contenuto sia inesistente.

1 - Sicuramente, è un po 'più complicato di così; ma punti come mappe settoriali, MFT speculari, ecc. non rientrano nell'ambito di questa domanda.


3

I filesystem memorizzano molte informazioni su un file come nome del file, dimensione del file, tempo di creazione, tempo di accesso, tempo di modifica, autorizzazioni create per utente, utente e gruppo, frammenti, puntatore a cluster che memorizzano il file, collegamenti hard / soft, attributi ... Questi sono chiamati metadati dei file . Perché conti questi metadati nella dimensione del file quando gli utenti non hanno (hanno bisogno di) preoccuparsene e non li conoscono? A loro interessa davvero solo il contenuto del file

Inoltre ogni file system memorizza diversi tipi di metadati che occupano diverse quantità di spazio sul disco. Ad esempio le autorizzazioni POSIX sono molto diverse dalle autorizzazioni NTFS e ci sono anche inodenumeri in POSIX che non esistono su Windows. Anche i filesystem POSIX variano molto, come ext3 con indirizzo di blocco a 32 bit, ext4 con 48-bit, Btrfs con 64-bit e ZFS con indirizzo a 128-bit. Quindi, come valuterete questi metadati nella dimensione del file?

Prendi un altro esempio con un file di 100 byte i cui metadati consumano 56 byte sul file system corrente. Copiamo il file su un altro filesystem e ora ci vogliono 128 byte di metadati. Tuttavia, il contenuto del file è esattamente lo stesso , anche il numero di byte nei file è lo stesso. Quindi visualizzare le dimensioni del file come 156 byte su un sistema ma 228 byte su un altro è molto confuso e controintuitivo .


1

Una dimensione del file di 0, è simile a dire: ho un documento con le 5parole su di esso. E su un altro documento, ha 0parole su di esso. Quindi 0è del tutto possibile.

I metadati del file (ora della data di creazione, ora della data dell'ultima modifica, proprietario del file, autorizzazioni) sono tutti memorizzati altrove e non inclusi come parte della dimensione del file.


0

Comprenderlo in modo semplice ... quando si crea un file ... viene generata una voce di directory che funge da puntatore per la posizione di memoria del file identificata dal nome file fornito. La dimensione della directory aumenta man mano che crei sempre più puntatori o dici file ... mentre la dimensione del file aumenta solo se metti alcuni dati nel punto indicato, cioè all'interno del file stesso. Fino ad allora la dimensione sarà zero. :)


Questo è davvero un commento, non una risposta, e ripete semplicemente ciò che gli altri hanno detto.
Jake Gould,

0

Quindi funziona così:

Non appena si crea un file su un volume, crea un record di file nel file mata NTFS, ad esempio $ MFT (tabella dei file master). Poiché nella MFT è presente un FRS (segmento record di file), verrà visualizzato un record. Ogni record di file ha dimensioni di 1 KB per impostazione predefinita nel caso di file system NTFS. Ma quello spazio è richiesto solo se si memorizzano alcune informazioni all'interno del file. Anche se scrivi una sola lettera "a" considerando che si tratta di un file di testo, verrà richiesto 1 KB di spazio perché questa è la dimensione predefinita di FRS. La lettera "a" va al flusso di dati predefinito e senza nome di quel FRS, $ Data che è un attributo in cui vanno tutti i dati se non si dispone di un ADS (flusso di dati alternativo).

Fammi sapere se hai qualche domanda.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.