Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Überprüfen, ob die angegebene Datei lesbaren Text enthält
Gumba
myCSharp.de - Member



Dabei seit:
Beiträge: 28

Themenstarter:

Überprüfen, ob die angegebene Datei lesbaren Text enthält

beantworten | zitieren | melden

Hallo Leute,

ich versuche grade Dateien ohne Rücksicht auf deren Endung auszulesen. Dabei will ich jedoch eine Art "Vorfilter" einbauen, so dass überprüft wird, ob die Datei wirklichen eine Textdatei ist und somit "lesbaren" Text enthält oder ob es sich um eine Datei handelt, welche nicht für das Auslesen geeignet ist, wie z.B. .mp3 -> wenn man solch eine Datei ausließt bekommt man nur kryptischen Text.
Vereinfacht gesagt bin ich auf der Suche nach Textdateien unabhängig von Ihrer Endung. Wie also kann ich die Dateien auf kryptischen oder normalen Text überprüfen?
Ich hoffe auf Antworten :)

Mfg
Gumba
private Nachricht | Beiträge des Benutzers
Nitro2k7
myCSharp.de - Member

Avatar #avatar-2881.jpg


Dabei seit:
Beiträge: 276
Herkunft: H

beantworten | zitieren | melden

Hallo Gumba,

du willst also überprüfen, ob eine Datei in Binärform oder Textformat vorliegt.

Ein Link vielleicht hier:

How can I determine if a file is binary or text in c#?

Gruss

nitro
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Gumba,

100%ig sicher kann man das nicht unterscheiden. Man kann nur bestimmte Kriterien heranziehen und dann eine Wahrscheinlichkeitsaussage treffen bzw. nur aufgrund eines Schwellwerts für die Wahrscheinlichkeit entscheiden.

Insbesondere das Kriterium wieviele Null-Bytes in der Datei enthalten sind, wurde seit der Einführung von (16-bit-)Unicode stark relativiert, da diese jetzt auch in Text-Dateien häufig vorkommen können.

Bestimmte Dateitypen beginnen mit bestimmten Zeichen- oder Bytefolgen (Bitmaps z.B. BM, normale EXE mit MZ). In (Unicode)Text-Dateien gibt es manchmal ein BOM. Aber auch das sind alles nur Indizien.

Aber wie Nitro2k7 indirekt zum Ausdruck gebracht hat: Das Thema wurde im Netz häufig besprochen. Eigentlich müssen wir das nicht erneut durchkauen. Wäre nett, wenn du die besten Treffer hier postest.

herbivore
private Nachricht | Beiträge des Benutzers
Gumba
myCSharp.de - Member



Dabei seit:
Beiträge: 28

Themenstarter:

beantworten | zitieren | melden

ok letzten endes ist es eine mischung aus folgender Methode und File.Extension geworden.

public static bool IsText(FileInfo fileName, int windowSize)
        {
                using (var fileStream = fileName.OpenRead())
                {
                    Encoding encoding;
                    var rawData = new byte[windowSize];
                    var text = new char[windowSize];
                    var isText = true;

                    // Read raw bytes
                    var rawLength = fileStream.Read(rawData, 0, rawData.Length);
                    fileStream.Seek(0, SeekOrigin.Begin);
                   
                    // Detect encoding correctly (from Rick Strahl's blog)
                    // http://www.west-wind.com/weblog/posts/2007/Nov/28/Detecting-Text-Encoding-for-StreamReader
                    if (rawData[0] == 0xef && rawData[1] == 0xbb && rawData[2] == 0xbf)
                    {
                        encoding = Encoding.UTF8;
                    }
                    else if (rawData[0] == 0xfe && rawData[1] == 0xff)
                    {
                        encoding = Encoding.Unicode;
                    }
                    else if (rawData[0] == 0 && rawData[1] == 0 && rawData[2] == 0xfe && rawData[3] == 0xff)
                    {
                        encoding = Encoding.UTF32;
                    }
                    else if (rawData[0] == 0x2b && rawData[1] == 0x2f && rawData[2] == 0x76)
                    {
                        encoding = Encoding.UTF7;
                    }
                    else
                    {
                        encoding = Encoding.Default;
                    }
                    // Read text and detect the encoding
                    using (var streamReader = new StreamReader(fileStream))
                    {
                        streamReader.Read(text, 0, text.Length);
                    }

                    using (var memoryStream = new MemoryStream())
                    {
                        using (var streamWriter = new StreamWriter(memoryStream, encoding))
                        {
                            // Write the text to a buffer
                            streamWriter.Write(text);
                            streamWriter.Flush();

                            // Get the buffer from the memory stream for comparision
                            var memoryBuffer = memoryStream.GetBuffer();

                            // Compare only bytes read
                            for (var i = 0; i < rawLength && isText; i++)
                            {
                                isText = rawData[i] == memoryBuffer[i];
                            }
                        }
                    }

                    return isText;
                }
        }

danke Nitro2k7 für den Link. Hätte sonst nich gewusst, wonach ich hätte suchen müssen ;)

Bis zum nächsten Problem!

Mfg
Gumba
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Gumba am .
private Nachricht | Beiträge des Benutzers