J'aimerais savoir comment les types de fichiers sont connus si les noms de fichiers n'ont pas de suffixe.
Par exemple, un fichier nommé myfile
peut être binaire ou texte pour commencer, comment le système sait-il si le fichier est binaire ou texte?
files
filesystems
mime-types
file-opening
Niklas Rosencrantz
la source
la source
Réponses:
L'
file
utilitaire détermine le type de fichier de 3 manières:Premièrement, les tests du système de fichiers : Dans ces tests, un des appels système de la famille stat est appelé sur le fichier. Cela retourne les différents types de fichiers unix : fichier normal, répertoire, lien, périphérique de caractère, périphérique de bloc, canal nommé ou un socket. En fonction de cela, les tests magiques sont effectués.
Les tests magiques sont un peu plus complexes. Les types de fichiers sont définis par une base de données de modèles appelée fichier magique . Certains types de fichiers peuvent être déterminés en lisant un bit ou un nombre à un endroit particulier du fichier (fichiers binaires par exemple). Le fichier magique contient des " nombres magiques " pour tester le fichier, qu'il le contienne ou non, et quelles informations textuelles doivent être imprimées. Ces " nombres magiques " peuvent être des valeurs de 1 à 4 octets, des chaînes, des dates ou même des expressions régulières. Avec d'autres tests, des informations supplémentaires peuvent être trouvées. Dans le cas d’un exécutable, l’information supplémentaire serait de savoir si elle est liée dynamiquement ou non, suppriméeou pas ou l'architecture. Parfois, plusieurs tests doivent réussir avant que le type de fichier puisse être vraiment identifié. Quoi qu'il en soit, le nombre de tests effectués n'a pas d'importance, c'est toujours une bonne idée .
Voici les 8 premiers octets dans un fichier de types de fichiers courants qui peuvent nous aider à avoir une idée de ce à quoi ces chiffres magiques peuvent ressembler:
Si le type de fichier ne peut pas être trouvé lors de tests magiques, le fichier semble être un fichier texte et
file
recherche l'encodage du contenu. Le codage se distingue par les différentes plages et séquences d'octets qui constituent du texte imprimable dans chaque ensemble.Les sauts de ligne sont également étudiés, en fonction de leurs valeurs HEX:
0A
(\n
) classe un fichier terminé Un * x / Linux / BSD / OSX0D 0A
(\r\n
) sont des fichiers de systèmes d'exploitation Microsoft0D
(\r
) serait Mac OS jusqu'à la version 915
(\025
) serait IBM AIXMaintenant, les tests de langue commencent. S'il semble s'agir d'un fichier texte, des chaînes particulières sont recherchées dans le fichier pour déterminer la langue qu'il contient (C, Perl, Bash). Certains langages de script peuvent également être identifiés via hashbang (
#!/bin/interpreter
) dans la première ligne du script.Si rien ne s'applique au fichier, le type de fichier ne peut pas être déterminé et
file
n'imprime que des "données".Donc, vous voyez qu'il n'y a pas besoin de suffixe. Un suffixe peut de toute façon confondre, s'il est mal défini.
la source
file(1)
fait, mais avec une implémentation (très) différente.Souvent, il s'en fiche. Vous le transmettez simplement à un programme et il l'interprète ou non. Il peut ne pas être utile d'ouvrir un fichier .jpg dans un éditeur de texte, mais cela ne vous empêche pas. L'extension, comme le reste du nom de fichier, est pour le confort organisationnel des humains.
Il peut également être possible de construire des fichiers pouvant être interprétés valablement de plusieurs manières. Étant donné que le format du fichier ZIP commence par un en-tête à la fin du fichier , vous pouvez ajouter d'autres éléments au début et le chargement se fera toujours sous la forme d'un fichier ZIP. Ceci est couramment utilisé pour créer des fichiers zip auto-extractibles.
la source
Cette information se trouve généralement dans l'en-tête du fichier. La
file
commande analyse la cible et vous indique des informations sur le fichier. Une grande partie de l'information provient souvent des en-têtes de fichier qui sont souvent les premiers octets d'un fichier (voir ci-dessous). Les en-têtes sont utilisés par le système pour déterminer comment gérer les fichiers.#!/bin/bash
au début d'un fichier indique au système d'utiliser le shell bash pour interpréter le script suivant.ELF
indique au système qu'il s'agit d'un exécutable ELF.Exemples d'en-tête de fichier:
la source
file
commande essaie de deviner à partir du contenu du fichier comment le fichier est probablement destiné à être utilisé. Ce n'est pas infaillible.file
. En fait, il fait une analyse du fichier. Cependant, la plupart des types de fichiers sont identifiés par un en-tête de tri.0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
est un en-tête d'un exécutable ELF (quelques premiers octets de / bin / ls). De même,#!/bin/bash
en haut d'un fichier ASCII, il serait identifié comme un script shell. Autre exemple:0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
(une image .png)La première chose à vérifier est le type de fichier codé en dur qui est reconnu par le noyau. Il s'agit des types de fichiers tels que répertoire, fichier spécial caractères, fichier spécial bloc, fichier spécial tuyau, socket et lien symbolique. Cette information provient de l'inode du fichier. Si le fichier est un fichier brut, le prochain ensemble d'informations provient des 256 premiers octets en recherchant des modèles. Ainsi, les fichiers texte et le code source C sont reconnus en examinant ces octets. En outre, les utilitaires recherchent également un nombre magique utilisé pour tester et valider le type de fichier. Vous pouvez ajouter vos propres types de fichiers à reconnaître en ajoutant les informations au fichier
/etc/magic
. Reportez-vous à la page de manuel pourmagic(5)
voir le format du fichier magique.Dans les implémentations plus anciennes (Solaris, par exemple), le fichier
/etc/magic
énumère la plupart des types de fichiers reconnus.la source
La
file
commande applique des méthodes heuristiques lors de l’inspection (d’une partie) du fichier et de la définition d’une estimation. De plus, il existe des cas particuliers dans lesquels des informations supplémentaires peuvent être obtenues; comme#!
au début d'un fichier texte, une BoM (marque d'ordre d'octet) ou des octets d'en-tête spécifiques de formats de fichier exécutables. Les#!
marques et binaires dans les exécutables sont utilisées par le système pour les différencier.la source
Le système ne sait pas si un fichier est binaire ou texte. Dans tous les systèmes d’exploitation (AFAIK) de type Unix,
fopen(path, "rb")
c’est exactement la même chose quefopen(path "r")
- celab
n’a aucun effet. Il est accepté car la norme C doit être portable sur certains systèmes d'exploitation qui font une telle distinction.la source
Dans le bon vieux temps des systèmes centraux, leur système d'exploitation prenait en charge plusieurs types de fichiers, notamment séquentiel et séquentiel indexé. Les systèmes d'exploitation modernes (Un * x et sans doute Windows) réduisent au minimum l'ensemble des types de fichiers (y compris les objets exécutables et partagés).
C'est possible, il existe un format de fichier délicat: un morceau de code C qui peut être interprété comme une description d'image. De plus, il existe différents formats de moins en moins spécifiques: fichier texte, fichier XML, un document SOAP.
la source