web-dev-qa-db-fra.com

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

Juste quelque chose que j'ai rencontré et 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 cela peut-il être expliqué? (Non spécifique au système d'exploitation)

173
Eugene S

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.

202
David Schwartz

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 (éditer: à 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 et que vous voulez savoir quelle taille de fichier tient sur ce disque dur, cela aura une signification très importante pour vous!

82
Cort Ammon

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 maîtres (MFT) séparément du contenu du fichier. Voir l'article Wikipedia sur les fichiers maîtres. Table .

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.

53
Matthew1471

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 votre propre) 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.

12
Luke

(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 examiner d'autres systèmes de fichiers «plus simples» tels que FAT 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; ce sont toutes des 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 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 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 commande UNIX touch), 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. Si vous n'écrivez que "Hello", la plupart du bloc est "vide" (en réalité, il ne s'agit pas de zéros, mais d'ordures semblables à celles qu'il y avait auparavant). Le tableau met donc é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épertoire, libérant ainsi les blocs de données de fichier à 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 leurs versions. 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!

7
Ian W

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:

 enter image description here

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 disque1.

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

 enter image description here

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.

4
OnoSendai

Les systèmes de fichiers stockent beaucoup d'informations sur un fichier, tels que nom du fichier, taille du fichier, heure de création, heure d'accès, heure de modification, autorisations utilisateur, utilisateur et groupe créées, fragments, pointeur sur les clusters stockant le fichier). , liens matériels/virtuels, attributs ... Celles-ci s'appellent 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 disque. Par exemple, les autorisations POSIX sont très différentes de l'autorisation NTFS et il existe également des nombres inode 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 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 le même, le nombre d'octets dans les fichiers est également identique. Ainsi, afficher la taille du fichier à 156 octets sur un système et 228 octets sur un autre est très très déroutant et contre-intuitif.

3
phuclv

Une taille de fichier de 0 revient à dire: j’ai un papier avec 5 mots dessus. Et sur un autre papier, il y a 0 mots dessus. Donc, 0 est tout à 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.

1

Donc, voici comment cela fonctionne:

Dès que vous créez un fichier sur un volume, un enregistrement de fichier est créé dans le fichier NTFS mata, à savoir $ MFT (table de fichiers maîtres). 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.

0
Sdf

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 .. alors que la taille de fichier n’augmentera que si vous placez quelques données à l’endroit indiqué, à l’intérieur du fichier lui-même. Jusque-là, la taille sera zéro. :)

0
Vikash Mishra