openFile Dialog Dateiformat erkennen

  • WPF

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Arby.

    openFile Dialog Dateiformat erkennen

    Vor dem Laden einer Datei soll das Dateiformat erkannt werden und zum Bsp als MessageBox ausgegeben werden:

    VB.NET-Quellcode

    1. Dim ofd As New Microsoft.Win32.OpenFileDialog
    2. ofd.InitialDirectory = "C:\Users\Thomas Stump\Desktop"
    3. ofd.Title = "Wählen Sie eine Datei aus"
    4. ofd.ShowDialog()
    5. 'Bei Auswahl der Datei erfolgt die Auswertung des Datenformats und Ausgabe als MessageBox...


    WIe geht das? Achtung es geht nicht um WinForms sondern um WPF!
    Entsprechend dem Resulat des Datenformates soll dann eine weitere Aktion erfolgen
    Also du kannst entweder die Extension pruefen, was aber nicht 100% sicher ist. Sonst kannst du ueber die Signatur pruefen was duetlich sicherer ist. Sollte dir der Mimetype reichen, kannst du die Function FindMimeFromData der urlmon.dll nutzen.
    garykessler.net/library/file_sigs.html
    And i think to myself... what a wonderfuL World!
    @Thomas2705 Du unterscheidest die Dateien anhand der Extension. Den FilterIndex solltest Du nicht brauchen, der ist primär zur initialen Anzeige des OFD da.
    Für den Fall einer "unsportlichen Verwechslung" wirfst Du einfach eine entsprechende Exception, oder, falls das nicht gewünscht ist, ne MessageBox.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für Eure Antworten. So siehts jetzt aus:

    VB.NET-Quellcode

    1. Imports Microsoft.Win32
    2. Imports System.IO
    3. Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
    4. Dim dlg As New OpenFileDialog()
    5. 'Pfad des Desktops auslesen und an InitialDirectory übergeben
    6. Dim WshShell As Object
    7. WshShell = CreateObject("WScript.Shell")
    8. Dim Pfad = WshShell.SpecialFolders("Desktop")
    9. WshShell = Nothing
    10. dlg.InitialDirectory = Pfad
    11. dlg.Filter = "Rich Text Format (*.rtf)|*.rtf|All files (*.*)|*.*"
    12. dlg.Multiselect = True
    13. If dlg.ShowDialog Then
    14. Dim fileStream As New IO.FileStream(dlg.FileName, FileMode.Open)
    15. Dim sFullName As String = dlg.FileName
    16. ' Pfad extrahieren
    17. Dim sPath As String = IO.Path.GetDirectoryName(sFullName)
    18. TextBox2.Text = sPath
    19. 'Dateiname extrahieren
    20. Dim sFile As String = IO.Path.GetFileName(sFullName)
    21. TextBox1.Text = sFile
    22. 'Dateierweiterung extrahieren
    23. Dim sExt As String = IO.Path.GetExtension(sFullName)
    24. TextBox3.Text = sExt
    25. If sExt < ".rtf" Then
    26. MessageBox.Show("falsche Datei!")
    27. End If
    28. End If
    29. End Sub
    Statt

    VB.NET-Quellcode

    1. Dim WshShell As Object
    2. WshShell = CreateObject("WScript.Shell")
    3. Dim Pfad = WshShell.SpecialFolders("Desktop")
    4. WshShell = Nothing
    5. dlg.InitialDirectory = Pfad

    Lieber

    VB.NET-Quellcode

    1. dlg.InitialDirectory = Environment.GetFolderPath(Environment.SpezialFolder.Desktop)

    Nehmen

    Bitte benehme deine Controls sauber. Textbox1 kann alles sein. Hilft auch später beim debuggen...

    Du kannst dir mal die FileInfo Klasse anschauen. Da sind allerlei nützliche Dinge drin, wenn man mit ner Datei rum wurschtelt :)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @Thomas2705 Der Filterindex ist dann wichtig, wenn unter derselben Extension verschiedene Formate abgelegt werden sollen, z.B. bei Word oder Excel.
    Die werden dann anhand des Filterindex' unterschieden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Öffne mit diesem deinen OpenFileDialog mal eine Textdatei ("txt") und schaue, was passiert.

    Ein paar weitere Dinge, die ich hier anmerken möchte. Mag vielleicht besserwisserisch rüberkommen, aber ich denke, dass bestimmte Fehler und Verständnisprobleme nie früh genug behoben werden können:

    1. Was die OpenFileDialog-Klasse aus System.Win32 mit WPF zu tun haben soll, versteht vermutlich niemand. Da ist nirgends WPF. Ist für die Lösung aber auch egal.

    2. Den Hinweis auf Environment.GetFolderPath() statt der COM-Klasse WScript.Shell hat MrMo schon gebracht. In WPF zu programmieren aber WScript.Shell zu nutzen ist ein Anachronismus erster Güte.

    3. "If dlg.ShowDialog Then" - ist eine Seuche, die nur VB (leider) erlaubt. ShowDialog ist eine Methode, keine Eigenschaft, darum gehören da (eigentlich) Klammern hinter den Aufruf -> If dlg.ShowDialog() Then ...

    4. Wenn das der komplette Code ist (und nicht nur ein Auszug davon), kannst du zum einen sPath und sFile als Variablen wieder rauswerfen. Sie sind zwar nicht falsch, aber überflüssig. Weise den Text direkt deinem Textfeld zu (in WPF würde man hier allerdings mit Binding arbeiten, aber das sähe ganz anders aus).

    4b. Zum anderen: Wofür instanzierst du den FileStream? Immerhin wird er nicht geöffnet, aber so ganz sauber ist das trotzdem nicht. Kein Fehler, aber eine mögliche Fehlerquelle bei künftigen Änderungen oder Erweiterungen des Codes.

    5. Den Vergleichsoperater "<" kann man für Strings nutzen. Viel Sinn ergibt das gerade bei .NET aber nicht (mehr). Siehe mein dezenter Hinweis am Anfang. Benutze String.Equals() oder String.Compare(). Vor allem denk daran, dass Dateinamen unter Windows nicht die Groß-/Kleinschreibung berücksichtigen. Was passiert wohl, wenn eine zu öffnende Datei die Endung ".RTF" oder gar ".rTf" haben sollte?

    Wenn es wirklich nur darum geht, zu prüfen, ob eine Datei vom Typ "RTF" ist, ist die sicherste Methode, die sog. "Magic Number" zu prüfen. Zu diesem Zweck öffnest du den FileStream und prüfst die ersten Zeichen der Datei. Ein RTF muss immer mit "{\rtf" beginnen. Wenn du so vorgehst, ist die Extension des Dateinamens tatsächlich egal. Vergiss nach dem Einlesen der Datei (bzw. der ersten 5 Zeichen der Datei) nicht, den FileStream wieder zu schließen. Gewöhne dir dazu am besten gleich die Nutzung des Schlüsselworts "Using" an. PS: Und lies bitte auf keinen Fall die komplette Datei dafür ein, das wäre Zeit- und Speicherverschwendung. Die ersten 5 Zeichen reichen.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Hallo Mr Mo
    DIe Benamsung habe ich nur auf Grund der Einfachheit genommen: im eigentlichen Programm läuft eine bessere Benamsung.

    Hallo Arby

    zu Satz 1- was sollte ich denn stattdessen verwenden?
    zu Satz 4- kannst Du mir hier ein Beispiel nennen
    zu Satz 5- kannst Du mir bitte ein Beispiel nennen

    "Magic Number ...und hier würde mir auch ein Beispiel helfen

    Thomas2705 schrieb:

    "Magic Number ...und hier würde mir auch ein Beispiel helfen
    Öffne eine Windows Bitmap in einem Hex-Viewer (vorher ggf. die Extension ändern), die fängt mit "BM" an.
    zu 1.: WinForm.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Thomas2705 schrieb:

    zu Satz 1- was sollte ich denn stattdessen verwenden?

    Das ist doch dir überlassen. Kannst gerne weiterhin diesen OpenFileDialog nehmen. Aber die Behauptung, das wäre WPF, ist halt falsch.

    Thomas2705 schrieb:

    zu Satz 4- kannst Du mir hier ein Beispiel nennen

    Das überlasse ich lieber anderen. Ich mach zu wenig mit WPF als dass ich Bindings "mal eben" aus dem Hut zaubern könnte.

    Thomas2705 schrieb:

    zu Satz 5- kannst Du mir bitte ein Beispiel nennen

    VB.NET-Quellcode

    1. If Not String.Equals(sExt, ".rtf", StringComparison.InvariantCultureIgnoreCase) Then
    2. '...
    3. End If


    Thomas2705 schrieb:

    "Magic Number ...und hier würde mir auch ein Beispiel helfen

    Seufz... okay, hier ein einfaches Beispiel:

    VB.NET-Quellcode

    1. Using fs As FileStream = New FileStream(dlg.FileName, FileMode.Open)
    2. Using tr As TextReader = New StreamReader(fs)
    3. Dim zeile As String = tr.ReadLine().Trim()
    4. If zeile.StartsWith("{\rtf") Then
    5. ' gewählte Datei ist mit großer Wahrscheinlichkeit im RTF-Format
    6. Else
    7. ' gewählte Datei ist mit Sicherheit kein RTF
    8. End If
    9. End Using
    10. End Using



    Mach was draus...
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.