2015-11-14 3 views
9

Ich arbeite an einem Projekt, das liest alle Dateien von lokalen Hdd, ich die Erweiterungen angeben, die ich in die Suche aufnehmen möchten.ist Datei lesbar (enthält Text ist eher zugänglich)

Alle ausgewählten Dateierweiterungen basieren auf der Tatsache, dass die Datei Textinhalt ist.

so für meine Verwendung i, welche Erweiterungen tragen acount, wie CS- .html .htm Css Js etc‘

angeben konnte, was, wenn ich möchte eine Funktion hinzuzufügen, die generische Benutzer lassen würde Wählen Sie die Erweiterungen und lassen Sie ihn aus allen verfügbaren Windows-Dateierweiterungen auswählen, aber nur die Dateien in seinem System, die Text sind. zum Beispiel wissen wir, dass exe, mp3. mpg, avi sind nicht , aber er könnte einige andere Dateitypen (.extensions) haben, die wir nicht berücksichtigt haben.

Gibt es eine Möglichkeit zu entscheiden, dass basierend auf Systemdateieigenschaft wenn nicht was wäre der Weg nur Textdateien zu filtern?

+2

Es gibt keinen guten Weg, das zu tun ... Also hackish "versuchen lesen und es ist Text, wenn Sie Inhalt verstehen können" ist "das Beste". Sie können nach "Dateityp ohne Erweiterung suchen" (oder etwas Ähnlichem) für frühere Diskussionen zum Thema suchen. –

+0

Erweiterungen geben nur einen schwachen Hinweis auf den Inhalt einer Datei. Ich wette, es gibt Anwendungen, die auch die '.cs' Erweiterung verwenden, ohne dass diese Dateien Text enthalten. –

+0

Ich glaube nicht, dass es einen gibt, zumindest keinen generischen. Zum Beispiel: Die Erweiterung docx aus einer Word-Datei ist kein Text, docx-Dateien sind gezippte XML-Dateien. Aber als Benutzer würden Sie wahrscheinlich erwarten, dass Word-Dateien als Text betrachtet werden. –

Antwort

3

Ein Mechanismus für Windows-Computer besteht darin, den Inhaltstyp in der Windows-Registrierung nachzuschlagen, die der Dateierweiterung zugeordnet ist. (Ich weiß nicht, von einer Art und Weise diese Lookup ohne direkte Registrierung zu tun.)

Innerhalb der Registrierung, Dateierweiterungen, die textbasierte sind in der Regel eine haben sollte oder mehrere dieser Merkmale:

  • A Inhaltstyp anzeigt MIME primäre Art des Textes, beispielsweise text/plain oder text/application
  • ein wahrgenommenes Typ text
  • Eine Standardprozedur mit dem GUID {5e941d80-bf96-11cd-b579-08002b30bfeb}, auf den Klartext persistent Handler zugeordnet.

Die folgende Methode werden alle Systemerweiterungen mit diesen Eigenschaften zugeordnet zurück:

// include using reference to Microsoft.Win32; 
static IEnumerable<string> GetTextExtensions() 
{ 
    var defaultcomp = StringComparison.InvariantCultureIgnoreCase; 
    var root = Registry.ClassesRoot; 
    foreach (var s in root.GetSubKeyNames() 
     .Where(a => a.StartsWith("."))) 
    { 
     using (RegistryKey subkey = root.OpenSubKey(s)) 
     { 
      if (subkey.GetValue("Content Type")?.ToString().StartsWith("text/", defaultcomp) == true) 
       yield return s; 
      else if (subkey.GetValue("PerceivedType")?.ToString().Equals("text", defaultcomp) == true) 
       yield return s; 
      else 
      { 
       using (var ph = subkey.OpenSubKey("PersistentHandler")) 
       { 
        if (ph?.GetValue("")?.ToString().Equals("{5e941d80-bf96-11cd-b579-08002b30bfeb}", defaultcomp) == true) 
         yield return s; 
       } 

      } 
     } 
    } 
} 

Der Ausgang hängt von der Workstation-Konfiguration, aber auf meinem aktuellen Gerät kehrt:

. a, .AddIn, .ans, .asc, .asm, .asmx, .aspx, .asx, .bas, .bat, .bcp, .c, .cc, .cd, .cls, .cmd, ...

Während dies auf Anfrage Installateure hängt Dateierweiterungen korrekt abbildet, erscheint es den meisten großen Textdateitypen zu identifizieren.

+0

p + 1 für einen besseren (sehr guten) Start als gar nicht! –

+0

btw mit Verweis auf Microsoft.Win32 .. wo haben Sie irgendeine Methode in 'Win32' aufgerufen? –

+0

@JbobJohan Die Registrierungsklassen befinden sich im Microsoft.Win32-Namespace. – drf

0

Im Allgemeinen gibt es keinen guten und zuverlässigen Weg, dies zu tun.

Sie können nicht durch den Vergleich Dateierweiterungen entscheiden - es ist nur ein Teil des Dateinamens und jeder kann es ändern, so kann auch file.exe eine Nur-Text-Datei sein.

C# - Check if File is Text Based
könnten Sie prüfen nur durch die ersten 1000 (beliebige Anzahl) Zeichen und sehen, ob es nicht druckbare Zeichen sind, oder wenn sie alle ascii in einem bestimmten Bereich.

+2

Ich habe nicht erkannt, dass _ "es gibt keinen Weg" _ ist eine Option mit der Programmierung, vor allem in einer so trivialen Aufgabe. –

+0

Also ich denke, die Problemumgehung ist, alles zu spezifizieren, was Sie wissen und fügen eine Option für den Benutzer hinzu .. (und er wäre in der Lage, jeden hinzuzufügen!) –

+0

Vorsicht vor Unicode, kann es unprintables enthalten –

Verwandte Themen