OpenFileDialog oberste Datei auswählen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von henrikl2000.

    henrikl2000 schrieb:

    oberste Datei aus zu wählen?
    So nicht, Du müsstest den OpenFileDialog fernsteuern.
    Hole Dir die betreffenden Dateien in ein FileInfo-Array und nimm die Datei mit dem Index 0:

    VB.NET-Quellcode

    1. Dim fi() = New IO.DirectoryInfo("c:\temp").GetFiles("*.png", IO.SearchOption.TopDirectoryOnly)
    2. MessageBox.Show(fi(0).FullName)

    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 deine Antwort.
    Das ergibt leider nicht ganz was ich suche aber vielleicht geht das gar nicht.

    Die Sortierung muss anders sein.
    Dein Code zeigt mir die die Nummer 3 in der OpenFileDialog gezeigte.
    Das Filter des OpenFileDialogs ist auf *.hdc gesetzt.

    Ich habe mir gedacht dass man wie mit Tab in die Datei Liste des OpenFileDialog kommen könnte.

    Trotzdem vielen dank

    henrikl2000 schrieb:

    Nummer 3
    Bei meinem Code werden die Dateien alphabetisch sortiert, die Reihenfolge der Dateien ist bei mir bei beiden gleich.
    Kannst Du mal die Reihenfolge bei Dir in beiden Fällen posten? (Screenshot)
    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!
    @henrikl2000

    Snipping Tool => Fenster Snip (oder wie das auf Deutsch heißt) => Speichern
    Forum => Erweitere Antwort => Dateianhänge => Auswählen und hochladen (=> im Text klicken => Dateianhang einfügen)

    Das in Klammern ist optional.
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln
    Es kommt ja drauf an wonach der OFD sortiert, und das ist bei jedem individuell. Es gibt nicht das oberste File.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    henrikl2000 schrieb:

    Hier die Bilder
    Bitte im Explorer mal runterscrollen.
    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!

    henrikl2000 schrieb:

    wie im Bild
    Ja.
    Der Unterschied liegt in der Sortierung numerischer Präfixe: 900 < 2000 <=> "900" > "2000".
    Ich verwende den "Salamander", da kann man die Sortierung vorgeben (im Explorer hab ich nix äquivalentes gefunden):
    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!
    Gilt das auch für OpenFileDialog?
    Ich meine wie Explorer. Wenn ja und man das nicht anders sortieren kann muss ich mir was anderes einfallen lassen.

    Die Bilder die ich hochgeladen habe sind nicht direkt vom Explorer sondern von meinem Projekt (OpenFileDialog).
    Das Problem ist hier ich kenne die Dateien nicht vor öffnen von OpenFileDialog. Ansonsten könnte ich einer der Dateien auswählen (.FileName)

    henrikl2000 schrieb:

    OpenFileDialog
    macht es wie der Explorer:

    FileInfo:
    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!

    henrikl2000 schrieb:

    wie Explorer?
    OpenFileDialog sortiert wie der Explorer, GetFiles() sortiert anders. ;(
    Da müsstest Du eine explizite Sortierroutine schreiben, Gugst Du hier.
    -----
    Neues Projekt, Form mit 2 Buttons und ListBox.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private fis() As IO.FileInfo
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. fis = New IO.DirectoryInfo("c:\temp\TestSort").GetFiles("*.*", IO.SearchOption.TopDirectoryOnly)
    5. End Sub
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. Array.Sort(fis, New MyComparer())
    8. Me.ListBox1.Items.Clear()
    9. Me.ListBox1.Items.AddRange(fis)
    10. End Sub
    11. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    12. Array.Sort(fis, New MyComparerExplorer())
    13. Me.ListBox1.Items.Clear()
    14. Me.ListBox1.Items.AddRange(fis)
    15. End Sub
    16. End Class
    17. Public Class MyComparerExplorer
    18. Implements IComparer(Of IO.FileInfo)
    19. Declare Unicode Function StrCmpLogicalW Lib "shlwapi.dll" ( _
    20. ByVal s1 As String, _
    21. ByVal s2 As String) As Int32
    22. Public Function Compare(ByVal x As IO.FileInfo, ByVal y As IO.FileInfo) As Integer _
    23. Implements System.Collections.Generic.IComparer(Of IO.FileInfo).Compare
    24. Return StrCmpLogicalW(x.FullName, y.FullName)
    25. End Function
    26. End Class
    27. Public Class MyComparer
    28. Implements IComparer(Of IO.FileInfo)
    29. Public Function Compare(ByVal x As IO.FileInfo, ByVal y As IO.FileInfo) As Integer _
    30. Implements System.Collections.Generic.IComparer(Of IO.FileInfo).Compare
    31. Return String.Compare(x.FullName, y.FullName)
    32. End Function
    33. End Class

    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!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    Danke dir vielmals.

    Ich habe allerdings ein Problem das richtig hin zu bekommen.

    Ich habe es versucht mit :

    VB.NET-Quellcode

    1. Public Class clsCompare Implements IComparer(Of String) Declare Unicode Function StrCmpLogicalW Lib "shlwapi.dll" ( _ ByVal s1 As String, _ ByVal s2 As String) As Int32 Public Function Compare(ByVal x As String, ByVal y As String) As Integer _ Implements System.Collections.Generic.IComparer(Of String).Compare Return StrCmpLogicalW(x, y) End FunctionEnd Class


    In mein Form:

    VB.NET-Quellcode

    1. If Directory.GetFiles(dlgFile.InitialDirectory, "*" & FileExt).Count > 0 Then
    2. Dim fi() As FileInfo = New DirectoryInfo(dlgFile.InitialDirectory).GetFiles("*.hdc", SearchOption.TopDirectoryOnly)
    3. Dim NyFi As String() = {}
    4. For i = 0 To fi.Length - 1
    5. NyFi(i) = fi(i).FullName
    6. Debug.Print(fi(i).FullName)
    7. Next
    8. Array.Sort(NyFi, New clsCompare())
    9. dlgFile.FileName = NyFi(0) ' fi(0).Name
    10. Else
    11. dlgFile.FileName = ""
    12. End If


    Ich erhalte ein Index out of range exception.
    Was mache ich hier falsch?

    henrikl2000 schrieb:

    Was mache ich hier falsch?

    henrikl2000 schrieb:

    VB.NET-Quellcode

    1. If Directory.GetFiles(dlgFile.InitialDirectory, "*" & FileExt).Count > 0 Then
    2. Dim fi() As FileInfo = New DirectoryInfo(dlgFile.InitialDirectory).GetFiles("*.hdc", SearchOption.TopDirectoryOnly)
    • Nimm nicht die InitialDirectory, das ist ein Input, kein Output.
    • Wenn Du einen Pfad vorgeben willst, nimm statt eines OpenFileDialog einen FolderBrowserDialog.
    • Du zählst Dateien mit der Extension FileExt und holst dann Dateien mit der Extension "*.hdc".
      Es knallt, wenn beide verschieden sind.
      Du listets die Dateien 2 Mal auf.
    • Du erstellst ein zweites Array, das Du nicht benötigst.
    • Rufe Array.Sort() nur dann auf, wenn auch Elemente da sind.
    • Du hast meinen Sorter nicht verstanden
    Teste genau dies (mit Deiner Extension):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Using dlgFile As New FolderBrowserDialog
    5. dlgFile.SelectedPath = "c:\temp\testsort"
    6. TextBox1.Text = ""
    7. If dlgFile.ShowDialog <> Windows.Forms.DialogResult.OK Then
    8. Return
    9. End If
    10. Dim fi() As FileInfo = New DirectoryInfo(dlg.SelectedPath).GetFiles("*.hdc", SearchOption.TopDirectoryOnly)
    11. 'Dim fi() As FileInfo = New DirectoryInfo(dlgFile.SelectedPath).GetFiles("*.txt", SearchOption.TopDirectoryOnly)
    12. If fi.Length = 0 Then
    13. Return
    14. End If
    15. Array.Sort(fi, New clsCompare())
    16. TextBox1.Text = fi(0).FullName
    17. End Using
    18. End Sub
    19. End Class
    20. Public Class clsCompare
    21. Implements IComparer(Of FileInfo)
    22. Declare Unicode Function StrCmpLogicalW Lib "shlwapi.dll" ( _
    23. ByVal s1 As String, _
    24. ByVal s2 As String) As Int32
    25. Public Function Compare(ByVal x As FileInfo, ByVal y As FileInfo) As Integer _
    26. Implements System.Collections.Generic.IComparer(Of FileInfo).Compare
    27. Return StrCmpLogicalW(x.FullName, y.FullName)
    28. End Function
    29. End Class
    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!