2010-05-27 7 views
4

Comment puis-je détecter si un fichier est binaire ou en texte brut?Détection d'un fichier binaire ou texte brut

Fondamentalement, mon application .NET traite des fichiers batch et l'extraction de données, mais je ne veux pas traiter les fichiers binaires. En guise de solution, je pense à analyser les X premiers octets du fichier et s'il y a plus de caractères non imprimables que de caractères imprimables, cela devrait être binaire.

Est-ce la bonne façon de le faire? Y a-t-il une meilleure mise en œuvre pour cette tâche?

+1

Votre méthode est à peu près comment je le ferais. Je chercherais beaucoup de \ n, mais la même idée. –

+1

Regardez http: // stackoverflow.com/questions/567757/how-do-je-distinguer-entre-binaire-et-textes-fichiers ou à http://stackoverflow.com/questions/277521/how-to-identify-the-file-content-is -in-ascii-ou-binaire - ce sont les mêmes questions, sauf que non spécialisé pour .NET, je pense que la plupart de ce que vous voulez savoir est déjà là. – schnaader

+0

Quel genre de traitement faites-vous? –

Répondre

4

La commande Unix file le fait d'une manière intelligente. Bien sûr, il en fait beaucoup plus, mais vous pouvez vérifier l'algorithme here et ensuite construire quelque chose de spécialisé.


MISE À JOUR: Le lien ci-dessus semble être rompu. Essayez this.

+1

Est-ce vraiment applicable à une application .Net fonctionnant sous Windows? –

+1

@Moron: oui, car 'file' n'utilise pas les informations fournies par le système d'exploitation pour déterminer le type de fichier. C'est juste regarder la nomenclature, les nombres magiques, l'heuristique de contenu, etc., comme mentionné diversement dans les autres réponses. –

+0

@Derrick: Qu'est-ce que je voulais dire, est-ce qu'il détecte les fichiers couramment trouvés sur les machines Windows, disons trouvé sur Windows Vista/Windows 7? Dans tous les cas, pointer quelqu'un vers le code source de 'fichier' n'est pas vraiment utile. –

0

Vous pouvez répéter le premier nombre X d'octets et donner une correspondance valide si tous les octets sont dans un bon character class. Mais cela pourrait supposer que vous connaissiez l'encodage.

6

Que voulez-vous dire par binaire? L'Art de la Guerre est-il écrit en chinois binaire? Qu'en est-il d'un dictionnaire japonais-anglais?

Il n'y a pas vraiment 100% de chemin.

Vous auriez besoin d'utiliser une sorte d'heuristique.

Certaines options pourraient être regarder:

Si ce qui précède (fichier en particulier les signatures et les extensions) n » t aider, puis essayez de deviner en fonction de la présence/absence de certains octets (comme vous le faites). Remarque: Il est préférable de vérifier d'abord les extensions/signatures, car vous n'aurez besoin que de lire quelques octets/métadonnées de fichier, ce qui serait plutôt efficace par rapport à la lecture complète du fichier.

+1

C'est la raison pour laquelle j'ai posé la question :) –

+0

La lecture de métadonnées est trop bien que vous ayez besoin d'une base de données de signature, etc. et pour ma tâche totalement sur l'ingénierie. –

+0

@dr. mal. Une vérification d'extension de fichier ne serait pas raisonnable? Je considère que les métadonnées de fichiers. Quoi qu'il en soit, je suppose que vous avez assez d'informations pour continuer votre travail :-) –

0

Je pense que la meilleure façon de le faire est de prendre au maximum les X premiers octets du fichier (X pourrait être 256, 512, etc), compter le nombre de caractères qui ne sont pas utilisés par les fichiers ASCII autorisés sont: 10, 13, 32-126). Si vous savez avec certitude que le script est écrit en anglais, aucun caractère ne peut être en dehors de l'ensemble mentionné. Si vous n'êtes pas sûr de la langue, vous pouvez autoriser au plus Y char à être en dehors de l'ensemble (si X est 512, je choisirais Y pour être 8 ou 10). Si cela ne suffit pas, vous pouvez utiliser plus de contraintes telles que: en fonction de la syntaxe des fichiers, de tels mots-clés devraient être présents (par exemple: pour vos fichiers batch, il devrait y avoir un peu d'écho, pour, si, goto, appel, sortie, etc)

Questions connexes