Question Comment une taille de fichier peut être zéro?


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


173
2017-09-15 08:32


origine


le nom du fichier ne compte pas dans le fichier, cela peut être expliqué. - njzk2
Je me souviens d'un ami à l'université qui a écrit un logiciel pour stocker le texte sous forme de noms de fichiers afin de contourner le quota de disque. - slebetman
@ColeJohnson J'ai été stagiaire dans les années 2000 dans l'un des laboratoires informatiques de mon U, et le quota d'utilisateurs était la somme des tailles de fichiers. Le stockage des données sous forme de noms de fichiers permettrait donc de contourner qouta. Heck vous pourriez enregistrer un programme dans Dossiers et cela ne compterait pas dans votre quota. - Mindwin
@slebetman C'est le point où la ligne entre le génie et la folie devient floue. - Pharap
Une technique similaire a été utilisée dans un défi de compression, - Oddthinking


Réponses:


C'est possible car il n'y a vraiment pas de fichier. Il n'y a qu'une entrée de répertoire avec un nom et un propriétaire. L'entrée de répertoire est logiquement distincte du fichier. Par exemple, le 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 où une entrée de répertoire "attache" un fichier à un répertoire et les noms de fichiers et les métadonnées associées sont stockés dans le répertoire.


201
2017-09-15 08:34



... également connu sous le nom de liens durs. - Daniel B
Dans le répertoire Sinon, si le même fichier se trouvait dans deux répertoires et que vous l'avez renommé en un, cela modifierait l'autre répertoire, ce qui n'aurait aucun sens. De plus, ne serait-ce pas, quel serait le contenu d'un répertoire?! - David Schwartz
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. Commandes comme ls -ld <directory> marchera. - David Schwartz
Je ne sais pas si cela est vrai pour la version actuelle de NTFS, mais les premières versions (par exemple sur NT3.x) stockent les données pour les très petits fichiers dans l'entrée du répertoire. Le fichier n'existerait littéralement pas. - John Rennie
Ce n'est pas tout à fait vrai qu'il n'y ait pas de fichier, à moins que NTFS ne soit très différent des autres systèmes de fichiers. Sur un système de fichiers Unix normal, il y aurait un inode stockant les permissions, les mod-times, 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 pour allouer des blocs. Un fichier vide possède l’équivalent du système de fichiers d’un pointeur NULL pour sa mappe de blocs, cependant, pour indiquer qu’il ne contient aucun bloc de données. Les entrées de répertoire ne sont pas encombrées d'autorisations et de temps de mod, même pour les fichiers vides. par exemple, les inodes XFS sont 256B - Peter Cordes


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

Il existe de nombreuses tailles de fichiers significatives. La plus courante, et celle 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 nombre est important pour les programmeurs car nous avons souvent besoin d'ouvrir un fichier, de "lire toutes les données" et de le fermer. Nous devons savoir combien d'octets de données seront dans le fichier afin que nous puissions planifier à l'avance.

Une autre signification découle de la façon dont la plupart des systèmes de fichiers stockent des données. La plupart des systèmes de fichiers stockent des données dans des 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 rien qui ne soit un multiple pair 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, sur laquelle vous tirez, serait le nombre de bits requis sur le disque dur pour décrire la présence d'un fichier. Cela inclut les informations qui sont généralement stockées séparément du fichier. Par exemple, sous Linux, le concept du "nom de fichier" est stocké dans l'inode du répertoire contenant le fichier (edit: à partir des commentaires, techniquement, cela est stocké dans les données du répertoire. Quand j'ai écrit ceci, je pensais au petit -directory case. Les données inférieures à 156 octets peuvent être stockées directement dans l'inode). Ce n'est pas une signification courante, car il est extrêmement difficile à déterminer sans connaître le fonctionnement interne extrêmement profond de votre système de fichiers (avez-vous tenu compte de l'espace nécessaire pour stocker toutes les autorisations sur le fichier?). Cependant, si vous avez un disque dur de 1 000 000 octets et que vous voulez savoir quelle taille de fichier correspond à ce disque dur, cela aura une signification très importante pour vous!


82
2017-09-15 17:41



"dans l'inode du répertoire contenant le fichier" Vous ne voulez pas dire les données du répertoire, plutôt que son inode? L'inode contient des tailles de fichiers et des dates, mais aucun nom ... - Medinoc
@ Medinoc Bon point. Je pensais au cas en ligne où il stockait les données dans l'inode, mais je n'ai pas vraiment vérifié à quel point cela pouvait se produire! J'ai ajouté une édition. - Cort Ammon
en relation fonctionnalité de données en ligne de ext4, ce n'est en aucun cas universel 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 ils sont des fonctionnalités distinctes. Un inode de fichiers a une taille définie, au moins dans le cas de ext4, donc l'utilisation des données des autorisations est sans importance. Une utilisation de disque de fichiers dépend fortement du système de fichiers utilisé, la troisième partie de cette réponse s'applique uniquement à ext4, pour autant que je sache, cela n'est pas clair. - Phizes
Si vous avez un disque dur de 1 000 000 octets, il serait peut-être temps de commencer à penser à une mise à niveau. - nekomatic


Le nom du fichier est stocké ailleurs.

Votre disque comportera un "système de fichiers", en mettant 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" (New Technology File System), qui stocke les informations de nom de fichier dans la table de fichiers maîtres (MFT), séparément du contenu du fichier. Article de Wikipedia sur Master File Table.

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


53
2017-09-15 21:58



et dans le cas de NTFS, la taille du fichier signalé par Windows et la plupart des outils est en fait la taille du fichier. courant dominant du fichier, que nous percevons comme le contenu du fichier. Le fichier stocké sur la partition NTFS peut également contenir des données stockées dans flux de données alternatifs, et ont toujours la taille déclarée de 0. C'est une fonctionnalité intéressante pour savoir si vous voulez avoir l'image complète :) - Paweł Bulwan


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

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

Tout comme votre nom existe sous la forme d'une idée dans la tête des gens (et la vôtre) qui fait référence au physique, le nom du fichier existe dans l'arborescence du système de fichiers et renvoie au fichier.


12
2017-09-16 14:59





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

Comment un fichier peut avoir la taille zéro est un peu plus compliqué que celui fourni par les réponses ci-dessus. La question est étiquetée Win7, mais en regardant d'autres systèmes de fichiers "plus simples" tels que GRAISSE ou NTFS, peut être utile 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. L'OS distingue la signification des blocs de données. Les premières sont spéciales, 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 les "données" que le système d'exploitation comprend sont un bloc d'informations contenant des informations sur les fichiers et non sur le contenu des fichiers. 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 des blocs de données (le catalogue de cartes se trouve également sur une structure en forme d'étagère).

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

  • Name = My_File.txt
  • Longueur = 0
  • Bloc de données de départ = N / A
  • Informations complémentaires (propriétaire, autorisations, date de création / mise à jour / modification), etc.

Seulement s'il y a des données à "écrire", tente-t-il de trouver un bloc de données vide pour stocker les données. Mais les blocs de données sont de tailles fixes (disons 32 Ko), ce qui est pratique pour que le disque puisse y accéder et que le système d'exploitation soit lu. Si vous écrivez seulement "Bonjour", la plus grande partie du bloc est "vide" (en fait, il ne s'agit peut-être pas de zéros, mais de la mémoire précédente). Fichier) afin que vous n'ayez pas 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 bloc suivant APRES le premier (et ainsi de suite). nouvelle longueur (détails différents).

Vous obtenez une collection de blocs de données (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 doit uniquement éditer 2 blocs de répertoires pour supprimer l'entrée d'un répertoire (bloc de données d'information) et en ajouter un autre. Supprimer un fichier: il suffit de supprimer l'entrée dans le bloc de répertoire, libérant ainsi les blocs de données du fichier à réallouer.

ps: le simple fait que le catalogue de cartes comporte une entrée pour un livre ne signifie pas que celui-ci se trouve sur la grille (peut-être extrait ou perdu); taille du fichier 0.

pps: Un livre mal placé dans la bibliothèque implique une bibliothèque de recherche, ou en termes informatiques: chkdsk ou disk de réparation!

Une meilleure compréhension peut être obtenue en lisant des informations sur les inodes UNIX ou en appréciant la façon dont les systèmes de contrôle de version (ClearCase, TFS, Git, etc.) gèrent non seulement les fichiers et 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 pour apparaître sous la forme d'une structure de répertoire et de fichiers classiques!


7
2017-09-16 09:55





Nous avons d’excellentes réponses ici - je voudrais juste ajouter la version de la photo (un millier de 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 montré en violet:

enter image description here

Ce petit carré violet décrit la liste des fichiers présents dans mon disque dur. En termes grossiers, 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 disque1.

Un fichier de taille zéro octet peut être visualisé sous la forme d'une entrée de table des matières qui ne pointe sur aucune page:

enter image description here

L'entrée est là, répertoriée - mais comme aucune page n'est indiquée, nous pouvons supposer que le contenu est inexistant.

1 - Sûrement, c'est un peu plus compliqué que ça; mais les points tels que les cartes sectorielles, les MFT miroir, etc. sont hors de portée de ces questions.


4
2017-09-24 00:05





Magasin de systèmes de fichiers beaucoup d'informations sur un fichier tel que nom de fichier, taille de fichier, heure de création, heure d'accès, heure de modification, autorisations utilisateur, utilisateur et groupe créées, fragments, pointeur vers les clusters qui stockent le fichier, liens matériels / logiciels, attributs ... Ceux-ci s'appellent métadonnées du fichier. Pourquoi comptez-vous ces métadonnées dans la taille du fichier lorsque les utilisateurs ne (doivent pas) s’en préoccuper et ne les connaissent pas? Ils se soucient uniquement du contenu du fichier

de plus chaque système de fichiers stocke différents types de métadonnées qui prennent différentes quantités d'espace sur le disque. Par exemple, les autorisations POSIX sont très différentes des autorisations NTFS, et il existe également inode numéros dans POSIX qui 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 comptez-vous 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 dans un autre système de fichiers et il faut maintenant 128 octets de métadonnées. Cependant, le le contenu du fichier est exactement le même, le nombre d'octets dans les fichiers sont également les mêmes. Donc, afficher la taille de fichier en tant que 156 octets sur un système mais 228 octets sur un autre est très déroutant et contre-intuitif.


3
2017-09-16 09:41





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

Les métadonnées du fichier (date et heure de création, date et heure 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.


1
2017-12-25 04:37





Comprenez-le simplement ... lorsque vous créez un fichier, il existe une entrée de répertoire qui sert de pointeur pour l’emplacement 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. Alors que la taille du fichier augmente uniquement si vous placez un certain nombre de données à l'endroit indiqué, c'est-à-dire à l'intérieur du fichier. Jusqu'à ce que la taille soit zéro. :)


0
2017-09-16 18:55



C'est vraiment un commentaire - pas une réponse - et répète ce que d'autres ont dit. - JakeGould


Voilà comment ça marche:

Dès que vous créez un fichier sur un volume, il crée un enregistrement de fichier dans le fichier mata NTFS, c'est-à-dire $ MFT (table de fichiers maîtres). Comme il y a un FRS (File record segment) présent dans la MFT, vous verrez un enregistrement. Chaque enregistrement de fichier est de taille 1 Ko par défaut dans le cas du système de fichiers NTFS. Mais cet espace n'est revendiqué que si vous stockez des informations dans le fichier. Même si vous écrivez une seule lettre "a" en considérant qu'il s'agit d'un fichier texte, il réclamera 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 sans nom de ce FRS, $ Data qui est un attribut où toutes vos données sont transmises si vous ne disposez pas d'un flux de données alternatif (ADS).

Faites-moi savoir si vous avez des questions.


0
2017-09-23 17:19