Comment une taille de fichier peut-elle être nulle?

173

Juste quelque chose que j'ai rencontré et je ne pouvais pas penser à une explication appropriée. Si je crée un fichier * .txt vide sur mon PC, puis que je regarde sa taille, il indique 0. Mais comment est-ce possible? Je veux dire, même si le fichier lui-même est vide, il doit quand même avoir une certaine taille, juste pour stocker son propre nom. Comment peut-on l'expliquer? (Non spécifique au système d'exploitation)

Eugene S
la source
81
le nom du fichier ne compte pas dans le fichier, c'est comment il peut être expliqué.
njzk2
123
Cela me rappelle un ami au collège qui a écrit un logiciel pour stocker le texte en tant que noms de fichiers afin de contourner le quota de disque.
slebetman
15
@ColeJohnson J'étais stagiaire dans les années 2000 dans l'un des laboratoires informatiques de mon université, et le quota d'utilisateurs était calculé en tant que somme des tailles de fichiers. Donc, stocker des données sous forme de noms de fichiers contournerait qouta. Heck, vous pouvez enregistrer un programme dans des dossiers et il ne serait pas comptabilisé dans votre quota.
Mindwin
20
@slebetman C'est le point où la ligne de démarcation entre génie et folie devient floue.
Pharap
10
Une technique similaire a été utilisée dans un défi de compression ,
Oddthinking

Réponses:

202

C'est possible car il n'y a vraiment pas de fichier. Il y a juste une entrée de répertoire avec un nom et un propriétaire. L'entrée du répertoire est logiquement distincte du fichier. Par exemple, un même fichier peut avoir plusieurs noms dans plusieurs répertoires.

Malheureusement, le terme "fichier" ne signifie pas toujours exactement la même chose. Mais la logique de taille de fichier provient du modèle dans lequel une entrée de répertoire "attache" un fichier à un répertoire et les noms de fichier et les métadonnées associées sont stockés dans le répertoire.

David Schwartz
la source
30
... également connu sous le nom de liens durs.
Daniel B
6
Dans le répertoire. Sinon, si le même fichier se trouvait dans deux répertoires et que vous le renommiez en un, cela modifierait l’autre répertoire, ce qui n’aurait aucun sens. En outre, si ce n'était pas ainsi, quel serait le contenu d'un répertoire?!
David Schwartz
14
Sur la plupart des systèmes d'exploitation de type UNIX, tels que FreeBSD et Linux, vous pouvez facilement obtenir la taille d'un répertoire. Des commandes comme ls -ld <directory>travaillera.
David Schwartz
11
Je ne sais pas si cela est vrai pour la version actuelle de NTFS, mais les versions antérieures (par exemple, sur NT3.x) stockaient les données pour de très petits fichiers dans l'entrée de répertoire. Le fichier n'existerait pas littéralement.
John Rennie
13
Ce n'est pas tout à fait vrai qu'il n'y a pas de fichier, à moins que NTFS soit très différent des autres systèmes de fichiers. Sur un système de fichiers Unix normal, il y aurait un inode qui stockerait les permissions, les temps de modification, etc. L'entrée de répertoire fait toujours référence à cet inode. La seule différence entre un fichier vide et un fichier non vide est le pointeur permettant d'allouer des blocs. Un fichier vide a le système de fichiers équivalent à un pointeur NULL pour sa carte de blocs, cependant, pour indiquer qu'il n'a pas de bloc de données. Les entrées de répertoire ne sont pas encombrées d'autorisations et de temps de modification, même pour les fichiers vides. par exemple, les inodes XFS sont 256B
Peter Cordes
82

La signification sémantique de "taille du fichier" est différente de celle que vous utilisez.

Il existe de nombreuses tailles de fichiers qui ont un sens. Le plus commun, et celui que vous voyez ici, est "le nombre d'octets dans le fichier". Si le fichier est un fichier texte vide, il peut en effet contenir 0 octet. Ce numéro est important pour les programmeurs car nous avons souvent besoin d'ouvrir un fichier, "lire toutes les données", et de le fermer. Nous devons savoir combien d'octets de données seront dans le fichier afin de pouvoir planifier à l'avance.

Une autre signification découle de la manière dont la plupart des systèmes de fichiers stockent des données. La plupart des systèmes de fichiers stockent les données par blocs. Par exemple, le système de fichiers peut stocker des données dans des blocs de 64 Ko, ce qui signifie qu'il n'allouera jamais quoi que ce soit qui ne soit pas un multiple de 64 Ko. Cela semble inefficace, mais cela peut rendre la comptabilité beaucoup plus simple et, souvent, plus simple signifie plus rapide.

Une troisième signification, à laquelle vous tirez, correspond au nombre réel de bits requis sur le disque dur pour décrire la présence d'un fichier. Cela inclut des informations qui sont généralement stockées séparément du fichier. Par exemple, sous Linux, le concept de "nom de fichier" est stocké dans l'inode du répertoire contenant le fichier (modifier: à partir de commentaires, techniquement, il est stocké dans les données du répertoire. Lorsque j'ai écrit cela, je pensais au petit -cas de répertoire: les données inférieures à 156 octets peuvent être stockées directement dans l'inode). Ce n'est pas un sens couramment utilisé, car il est extrêmement difficile à déterminer sans connaître les rouages ​​profonds de votre système de fichiers (avez-vous pris en compte l'espace nécessaire pour stocker toutes les autorisations sur le fichier?). Cependant, si vous avez un disque dur de 1 000 000 octets,

Cort Ammon
la source
2
"dans l'inode du répertoire contenant le fichier" Ne voulez-vous pas dire les données du répertoire, plutôt que son inode? L'inode contient des tailles de fichier et des dates, mais aucun nom ...
Medinoc le
@ Medinoc Bon point. Je pensais au cas en ligne quand il stockait les données dans l'inode, mais je n'ai pas réellement vérifié si cela pouvait se produire! J'ai ajouté une modification.
Cort Ammon
La fonctionnalité de données en ligne associée à ext4 n’est en aucun cas universelle sur tous les systèmes de fichiers. En outre, cela s'applique aux fichiers inode, pas au répertoire. Ils sont séparés, les répertoires ont également une capacité de données en ligne, mais ce sont des fonctionnalités distinctes. Un inode de fichiers a une taille définie, du moins dans le cas de ext4, de sorte que l'utilisation des autorisations par les données n'est pas pertinente. L'utilisation d'un disque de fichiers dépend fortement du système de fichiers utilisé, la troisième partie de cette réponse ne s'applique qu'à ext4, pour autant que je sache, ce n'est pas clair.
Phizes
8
Si vous avez un disque dur de 1 000 000 octets, il est peut-être temps de penser à une mise à niveau.
nekomatic
53

Le nom du fichier est stocké ailleurs.

Votre disque aura un "système de fichiers", simplement une méthode pour choisir comment les noms de fichiers et les fichiers sont représentés et interprétés sur le disque physique.

Sur la plupart des disques Windows, vous utiliserez un système de fichiers appelé "NTFS" (système de fichiers de nouvelle technologie), qui stocke les informations de nom de fichier dans la table de fichiers principale (MFT) séparément du contenu du fichier. Voir l'article de Wikipedia sur la table de fichiers principale .

Le fichier lui-même aura donc une longueur de 0 octet, mais son entrée dans la MFT occupera toujours un peu d’espace.

Matthew1471
la source
11
et dans le cas de NTFS, la taille du fichier indiquée par Windows et la plupart des outils est en fait la taille du flux principal du fichier, que nous percevons comme le contenu du fichier. Le fichier stocké sur une partition NTFS peut également contenir des données stockées dans des flux de données alternatifs , tout en conservant la taille 0 indiquée . C'est une bonne fonctionnalité de système de fichiers de savoir si vous voulez avoir une image complète :)
Paweł Bulwan
12

C'est une question ontologique assez intéressante ...

Le fichier lui-même est le contenu du fichier. Si le fichier n'a pas de contenu, sa taille est zéro. Le nom de fichier fait autant partie du fichier que votre propre nom est physiquement une partie de vous (c'est-à-dire qu'il ne l'est pas).

Tout comme votre nom existe comme une idée dans la tête des gens (et la vôtre) qui fait référence / pointe vers votre physique, le nom de fichier existe dans l’arborescence du système de fichiers et il fait référence / pointe vers le fichier.

Luke
la source
7

(Un peu tard pour la réponse ...)

Comment un fichier peut-il être de taille zéro est un peu plus compliqué que prévu par les réponses ci-dessus. La question est étiquetée Win7, mais il peut être utile d' examiner d'autres systèmes de fichiers "plus simples" tels que FAT ou NTFS , car les concepts sont similaires.

Le disque ne "sait" pas ce qu'est un fichier et ce qu'est un répertoire; c'est toutes les données en petits blocs. Le système d'exploitation distingue la signification des blocs de données. Les quelques premiers sont spéciaux, mais le reste des blocs contient des informations sur les données (par exemple: nom du fichier, longueur du fichier, premier bloc de données contenant les données) ou les données elles-mêmes.

Un répertoire est un "fichier" spécial dont le système d'exploitation comprend les "données" est un bloc d'informations contenant des informations sur les fichiers, pas leur contenu. Une bonne analogie est une bibliothèque physique et le catalogue de cartes. Considérez les blocs d’information comme le catalogue de cartes et les étagères comme les blocs de données (le catalogue de cartes repose également sur une structure semblable à une étagère).

Lorsque vous "créez" un fichier (par exemple avec la touchcommande UNIX ), le système d'exploitation crée d'abord une entrée dans un bloc d'informations (répertoire), avec les éléments suivants:

  • Nom = Mon_Fichier.txt
  • Longueur = 0
  • Bloc de données de départ = N / A
  • Informations supplémentaires (propriétaire, autorisations, date de création / mise à jour / modifiée), etc.

Ce n'est que s'il y a des données à "écrire" qu'il tente de trouver un bloc de données vide pour stocker les données. Mais les blocs de données ont des tailles fixes (disons 32 Ko), ce qui est pratique pour le disque et le système d'exploitation pour le lire. Si vous n'écrivez que "Hello", la majeure partie du bloc est "vide" (en réalité, il ne s'agit pas de zéros, mais de déchets de ce qui existait auparavant), de sorte que le tableau met également à jour la taille à la longueur (disons 5 caractères + Fin de Fichier) pour ne pas avoir les mauvaises choses.

Lorsque vous mettez à jour le "fichier" à une longueur> taille de bloc, le système d'exploitation écrit les données dans le nouveau bloc et met à jour un bloc de données pour indiquer que le fichier continue sur le prochain bloc APRÈS le premier (et ainsi de suite) et que la longueur est mise à jour. nouvelle longueur (les détails diffèrent).

Vous vous retrouvez avec une collection de blocs de données d'informations (répertoires ou listes) contenant des informations sur les chaînes de blocs de données (contenu du fichier).

Logiquement, cela explique également pourquoi un déplacement de fichier sur le même système de fichiers clignote rapidement, alors qu'une copie prend beaucoup de temps. Le système d'exploitation n'a qu'à modifier 2 blocs de répertoire pour supprimer l'entrée d'un répertoire (bloc de données d'informations) et l'ajouter à un autre. Supprimer un fichier: supprimez simplement l'entrée dans le bloc de répertoires, libérant ainsi les blocs de données de fichiers à réaffecter.

ps: Le fait que le catalogue de cartes comporte une entrée pour un livre ne signifie pas que celui-ci est sur l'étagère (extrait ou perdu peut-être); taille de fichier 0.

pps: Un livre égaré dans une bibliothèque implique une bibliothèque de recherche, ou en termes informatiques: chkdsk ou disque de réparation!

Pour mieux comprendre, renseignez-vous sur les inodes UNIX ou apprenez comment les systèmes de contrôle de versions (ClearCase, TFS, Git, etc.) gèrent non seulement les fichiers et les répertoires, mais également les versions de fichiers et même les versions de répertoires. Dans la plupart des cas, tout est stocké dans une base de données et présenté à l'utilisateur sous forme de structure de répertoire classique et de fichiers!

Ian W
la source
4

Nous avons d'excellentes réponses ici - je voudrais juste ajouter la version de l'image (mille mots et tout ça.)

Voici à quoi ressemble l'un de mes disques durs au format NTFS si vous le visualisez avec un outil de défragmentation de disque. Le MFT (Master File Table) est affiché en violet:

entrez la description de l'image ici

Ce petit carré violet décrit la liste des fichiers présents dans mon disque dur. En gros, il s'agit, pour un disque NTFS, de la table des matières pour un livre; au lieu de pages, il pointe vers leur emplacement physique sur le reste du disque 1 .

Un fichier dont la taille est égale à zéro octet peut être visualisé comme une entrée de la table des matières qui ne pointe vers aucune page:

entrez la description de l'image ici

L'entrée est là, listée - mais comme aucune page n'est indiquée, on peut supposer que le contenu est inexistant.

1 - C’est sûrement un peu plus compliqué que ça; mais des points tels que les cartes de secteurs, les MFT en miroir, etc. sont hors du champ de cette question.

OnoSendai
la source
3

Les systèmes de fichiers stockent de nombreuses informations sur un fichier, telles que le nom de fichier, la taille du fichier, l'heure de création, l'heure d'accès, l'heure de modification, les autorisations utilisateur, utilisateur et groupe créées, les fragments, le pointeur sur les clusters stockant le fichier, les liens matériels / virtuels, les attributs ... Celles-ci sont appelées métadonnées de fichier . Pourquoi comptez-vous ces métadonnées dans la taille du fichier alors que les utilisateurs ne s’occupent pas (nécessairement) de celles-ci et ne les connaissent pas? Ils ne se soucient que du contenu du fichier

De plus, chaque système de fichiers stocke différents types de métadonnées qui occupent différentes quantités d’espace sur le disque. Par exemple, les autorisations POSIX sont très différentes de l'autorisation NTFS et certains inodenuméros dans POSIX n'existent pas sous Windows. Même les systèmes de fichiers POSIX varient beaucoup, comme ext3 avec une adresse de bloc 32 bits, ext4 avec 48 bits, Btrfs avec 64 bits et ZFS avec une adresse 128 bits. Alors, comment allez-vous compter ces métadonnées dans la taille du fichier?

Prenons un autre exemple avec un fichier de 100 octets dont les métadonnées consomment 56 octets sur le système de fichiers actuel. Nous copions le fichier sur un autre système de fichiers et cela prend maintenant 128 octets de métadonnées. Cependant, le contenu du fichier est exactement identique , le nombre d'octets dans les fichiers est également identique. Il est donc très déroutant et contre-intuitif d’ afficher une taille de fichier de 156 octets sur un système mais de 228 octets sur un système .

phuclv
la source
1

Une taille de fichier de 0, est similaire à dire: j'ai un papier avec des 5mots dessus. Et sur un autre papier, il y a des 0mots dessus. C'est donc 0tout à fait possible.

Les métadonnées du fichier (date de création, date de la dernière modification, propriétaire du fichier, autorisations) sont toutes stockées ailleurs et ne sont pas incluses dans la taille du fichier.

nopole
la source
0

Comprenez-le d'une manière simple ... lorsque vous créez un fichier .. une entrée de répertoire est générée, qui fonctionne comme un pointeur pour l'emplacement de la mémoire du fichier identifié par le nom de fichier que vous indiquez. La taille du répertoire augmente à mesure que vous créez de plus en plus de pointeurs ou de fichiers .. tandis que la taille de fichier n'augmente que si vous placez quelques données à l'endroit indiqué, c'est-à-dire à l'intérieur du fichier lui-même. Jusque-là, la taille sera zéro. :)

Vikash Mishra
la source
C'est vraiment un commentaire - pas une réponse - et ne fait que répéter ce que d'autres ont dit.
JakeGould
0

Donc, voici comment cela fonctionne:

Dès que vous créez un fichier sur un volume, il crée un enregistrement dans le fichier NTFS mata, par exemple $ MFT (table de fichiers maître). Puisqu'il y a un FRS (segment d'enregistrement) présent dans la MFT, vous verrez un enregistrement. Chaque enregistrement de fichier a une taille par défaut de 1 Ko dans le cas d’un système de fichiers NTFS. Mais cet espace n'est revendiqué que si vous stockez des informations à l'intérieur du fichier. Même si vous n’écrivez qu’une seule lettre "a", étant donné qu’il s’agit d’un fichier texte, il demandera 1 Ko d’espace car il s’agit de la taille par défaut du FRS. La lettre "a" va au flux de données par défaut et non nommé de ce FRS, $ Data qui est un attribut auquel toutes vos données vont si vous ne disposez pas d'un ADS (Alternate Data Stream).

Faites-moi savoir si vous avez des questions.

Sdf
la source