Frage

Informell, verstehen die meisten von uns, dass es Binärdienst Dateien (Objektdateien, Bilder, Filme, ausführbare Dateien, proprietäre Dokumentformate, etc.) und ‚Text‘ Dateien (Quellcode, XML-Dateien, HTML-Dateien, E-Mail, etc. ).

In der Regel müssen Sie den Inhalt einer Datei kennen, um etwas Sinnvolles damit zu tun, und diesen Standpunkt zu bilden, wenn die Codierung ‚binäre‘ oder ‚Text‘ ist, ist es nicht wirklich wichtig. Und natürlich Dateien speichern nur Bytes von Daten, so sind sie alle ‚binär‘ und ‚Text‘ bedeutet nichts ohne die Codierung zu kennen. Und doch ist es immer noch nützlich ist, um ‚binäre‘ und ‚Text‘ Dateien zu sprechen, aber zu vermeiden, jemand mit dieser ungenauen Definition zu beleidigen, werde ich auch weiterhin ‚scare‘ Anführungszeichen verwenden.

Allerdings gibt es verschiedene Werkzeuge, die auf einer breiten Palette von Dateien arbeiten, und in der Praxis, möchten Sie etwas anderes basierend auf tun, ob die Datei ‚Text‘ oder ‚Binär‘. Ein Beispiel hierfür ist jedes Werkzeug, das Datum auf der Konsole ausgibt. Plain ‚Text‘ wird gut aussehen, und ist nützlich. Binärdienst Daten vermasseln Ihren Terminal, und sind in der Regel nicht sinnvoll, zu betrachten. GNU grep zumindest verwendet diese Unterscheidung bei der Bestimmung, ob es ausgeben sollten Streichhölzer an die Konsole.

So wird die Frage, wie Sie sagen, wenn eine Datei ‚Text‘ oder ‚binary‘ ist? Und weiter einschränken wird, wie Sie auf einem Linux wie Dateisystem erzählen? Ich bin nicht bekannt, dass Dateisystem-Metadaten, die den ‚Typ‘ einer Datei anzeigt, so weiter die Frage, indem Sie den Inhalt einer Datei die Kontrolle, wie kann ich feststellen, ob es ‚Text‘ oder ‚binary‘ ist? Und der Einfachheit halber lässt beschränken ‚Text‘ Zeichen zu verstehen, die auf dem Benutzerkonsole druckbar sind. Und vor allem, wie würden Sie implementieren das? (Ich dachte, das auf dieser Seite angedeutet wurde, aber ich denke, es ist hilfreich, in der Regel auf vorhandenen Code hingewiesen werden, dass dies tut, sollte ich angegeben haben), ich bin nicht wirklich nach dem, was die bestehenden Programme kann ich nutzen, um dies.

War es hilfreich?

Lösung

Die Tabellenkalkulations-Software meine Firma liest sowie Textdateien eine Reihe von binären Dateiformaten macht.

Wir betrachten zunächst die ersten paar Bytes für ein magische Zahl die wir erkenne. Wenn wir die magische Zahl von jedem der binären Typen lesen wir nicht erkennen, dann schauen wir uns bis zu dem ersten 2K Bytes der Datei, um zu sehen, ob es ein UTF-8 , Codepage das Host-Betriebssystem. Wenn es keiner dieser Tests besteht, gehen wir davon aus, dass es nicht eine Datei ist, können wir mit umgehen und eine entsprechende Ausnahme aus.

Andere Tipps

Sie können den file Befehl verwenden. Es hat eine Reihe von Tests auf der Datei (man file) zu entscheiden, ob es für Binär- oder Text ist. Sie können den Quellcode schauen / ausleihen, wenn Sie von C, das tun müssen.

file README
README: ASCII English text, with very long lines

file /bin/bash
/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped

Sie können die MIME-Typ der Datei bestimmen, die mit

file --mime FILENAME

Die Stenografie ist file -i auf Linux und file -I (Kapital i) auf macOS (siehe Kommentar).

Wenn es mit text/ beginnt, es ist Text, sonst binär. Die einzige Ausnahme sind XML-Anwendungen. Sie können am Ende des Dateityps die von der Suche nach +xml entsprechen.

Nun, wenn Sie nur die gesamte Datei der Kontrolle, ob jedes Zeichen mit isprint(c) bedruckbar ist. Es wird ein wenig komplizierter für Unicode.

Unicode-Textdatei zu unterscheiden, MSDN einige Angebote gute Ratschläge, was zu tun.

Der Kern von ihm ist es, zunächst auf die ersten vier Bytes zu inspizieren:

EF BB BF     UTF-8 
FF FE        UTF-16, little endian 
FE FF        UTF-16, big endian 
FF FE 00 00  UTF-32, little endian 
00 00 FE FF  UTF-32, big-endian 

Das wird Sie die Codierung erzählen. Dann würden Sie iswprint(c) für den Rest der Zeichen in der Textdatei verwendet werden soll. Für UTF-8 und UTF-16, müssen Sie die Daten manuell analysieren, da ein einzelnes Zeichen kann durch eine variable Anzahl von Bytes dargestellt werden. Auch, wenn Sie wirklich anal sind, sollten Sie das Gebietsschema Variante iswprint verwenden, wenn diese auf Ihrer Plattform verfügbar ist.

Perl hat eine gute Heuristik. Verwenden Sie den -B Operator für binäres zu testen (und sein Gegenteil, -T für Text zu testen). Hier Shell einen Einzeiler Textdatei zur Liste:

$ find . -type f -print0 | perl -0nE 'say if -f and -s _ and -T _'

(Beachten Sie, dass diese Unterstrichen ohne vorhergehende Dollar korrekt ist (RTFM).)

Die meisten Programme, die versuchen, der Unterschied zu erkennen eine Heuristik verwenden, wie zum Beispiel der Prüfung des ersten n Bytes der Datei und sehen, ob dieser Bytes alle qualifizieren als ‚Text‘ oder nicht (dh, tun sie alle fallen in den Bereich der druckbaren ASCII charcters). Für feinere distiction gibt es immer die ‚Datei‘ den Befehl UNIX-ähnliche Systeme.

Es ist ein altes Thema, aber vielleicht wird jemand diesen Kommentar hilfreich. Wenn Sie in einem Skript zu entscheiden, ob etwas ist eine Datei, dann können Sie einfach tun, wie folgt:

if file -i $1 | grep -q text;
then 
.
.
fi

Damit wird den Dateityp und mit einem stillen grep bekommen Sie, wenn ich einen Text entscheiden.

Um Textdateinamen in aktuellem Verzeichnis / subdirs Liste:

$ grep -rIl ''

Binaries:

$ grep -rIL ''

bestimmte Datei zu überprüfen, ändern leicht Befehl:

$ grep -qI '' FILE

dann, Exit-Status '0' würde die Datei bedeuten ist ein Text; '1' - binär. Könnte überprüfen:

$ echo $?

Eine einfache Prüfung ist, wenn es Zeichen \0 hat. Textdateien nicht in Anspruch genommen haben.

Wie bereits erwähnt * nichts Betriebssysteme haben diese Fähigkeit in der Datei Befehl. Dieser Befehl verwendet eine Konfigurationsdatei, die in vielen gängigen Dateistrukturen enthalten magische Zahlen definiert.

Diese Datei wurde genannt Magie historisch in / etc gespeichert, obwohl dies in sein / usr / share auf einigen Distributionen. Die magische Datei definiert Offsets der Werte bekannt in der Datei existieren und diese Orte dann prüfen können den Typ der Datei zu bestimmen.

Die Struktur und die Beschreibung der magischen Datei können durch Abfragen der entsprechende Handbuchseite (man Magie)

finden

Wie für eine Implementierung, auch das kann innerhalb von file.c selbst, die bestimmt, ob es lesbarer Text ist oder nicht, ist die folgende

/* Make sure we are dealing with ascii text before looking for tokens */
    for (i = 0; i < nbytes - 1; i++) {
        if (!isascii(buf[i]) ||
            (iscntrl(buf[i]) && !isspace(buf[i]) &&
             buf[i] != '\b' && buf[i] != '\032' && buf[i] != '\033'
            )
           )
            return 0;   /* not all ASCII */
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top