Nach Ordner Suchen und gegebenfalls öffnen

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    Nach Ordner Suchen und gegebenfalls öffnen

    Hallo Ihr,
    wie kann ich nach einem Ordner suchen und ihn falls verfügbar öffnen?

    Ich habe ein Verzeichnis, in welchem viele Ordner enthalten sind. Die Namen der Ordner sind immer nach diesem Muster aufgebaut:
    Name = Zahl & " " & Text

    Nun weiß mein Programm allerdings nur die Zahl. Das Programm soll also die ersten 3 Ziffern lesen und dann schauen ob das die richtigen sind.
    Bisher mach ich es mit einer Schleife, welche jeden Namen einließt und dann mit Split die ersten Zeichen ließt und vergleicht. Ich bin mir aber sicher, dass es da sicherlich einen besseren Weg gibt.

    Falls jemand eine Idee hat würde ich mich sehr darüber freuen!
    Lg
    JB

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    JB_ schrieb:

    welche jeden Namen einließt und dann mit Split die ersten Zeichen ließt und vergleicht.
    Irgendwann musst du immer die ganzen Namen einlesen.
    Entweder zum Zeitpunkt der Suche oder früher.
    Suchprogramme halten sich im Hintergrund eine Index-DB der Verzeichnisstruktur, um schneller darin suchen zu können.

    Ich habe nicht verstanden, was du mit Split machst.
    Ich hätte SubString oder BeginsWith oder Like verstanden.
    Oder, falls du tatsächlich wie angegeben in VBA arbeitest, Left.
    Aber Split?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    hast du für "Name = Zahl & " " & Text" einpaar bsp
    ob es geht keine ahnung aber so ähnlich, aber besser, könne ein code aussehen dafür
    Spoiler anzeigen

    C#-Quellcode

    1. public class RecusiveFolderScan {
    2. private static Regex ScanPatter;
    3. private static bool ScanForFile;
    4. public static string[] Scan(string path, string patter, bool file = true) => Scan(new DirectoryInfo(path), patter, file);
    5. public static string[] Scan(DirectoryInfo root, string patter, bool file = true) {
    6. ScanPatter = new Regex(patter);
    7. ScanForFile = file;
    8. return ScanDir(root).ToArray();
    9. }
    10. private static IEnumerable<string> ScanFiles(params FileInfo[] files) {
    11. for(int i = 0, n = files.Length; i < n; i += 1) {
    12. FileInfo file = files[i];
    13. string fName = file.Name;
    14. if (ScanPatter.IsMatch(fName)) {
    15. yield return file.FullName;
    16. }
    17. }
    18. }
    19. private static IEnumerable<string> ScanDir(params DirectoryInfo[] dirs) {
    20. for (int i = 0, n = dirs.Length; i < n; i += 1) {
    21. DirectoryInfo dir = dirs[i];
    22. string fName = dir.Name;
    23. if (ScanForFile) {
    24. string[] filesPathes = ScanFiles(dir.GetFiles()).ToArray();
    25. for (int subI = 0, subN = filesPathes.Length; subI < subN; subI += 1) {
    26. yield return filesPathes[subI];
    27. }
    28. } else {
    29. if (ScanPatter.IsMatch(fName)) {
    30. yield return dir.FullName;
    31. }
    32. }
    33. string[] subResult = ScanDir(dir.GetDirectories()).ToArray();
    34. for (int subI = 0, subN = subResult.Length; subI < subN; subI += 1) {
    35. yield return subResult[subI];
    36. }
    37. }
    38. }
    39. }
    Hallo Ihr,
    erstmals vielen Dank für eure Ideen und Infos.
    Ich programmiere in Visual Studio in Basic
    Ich hab´s jetzt folgendermaßen gelöst, falls jemand Interesse an meiner Vorgehensweise hat

    VB.NET-Quellcode

    1. Dim ErsteZahlen(2) As String
    2. ErsteZahlen = Split(ComboBox4.Text, "-", -1) 'Hier können natürlich auch andere Kriterien zur Teilung eingebaut werden
    3. If ErsteZahlen(2).Length < 3 Then
    4. ErsteZahlen(2) = "0" + ErsteZahlen(2) 'Da in meinem Fall bei nur 2-stelligen Zahlen immer eine 0 davor steht füge ich diese hier hinzu
    5. End If
    6. MsgBox(ErsteZahlen(0) & " " & ErsteZahlen(1) & " " & ErsteZahlen(2)) 'Zur Kontrolle lass ich mir die einzelnen Teile ausgeben
    7. Try
    8. Dim path As String() = Directory.GetDirectories("Z:\01 1 05 Gutachten\" & ErsteZahlen(1) & "\" & ErsteZahlen(0), ErsteZahlen(2) & "*") 'Versuchen, ob eine Datei auffindbar ist
    9. Process.Start(path(0)) 'Ordner öffnen
    10. Catch es As System.Exception
    11. MsgBox(es.ToString) 'Gegebenfalls Fehlermeldung ausgeben
    12. End Try

    Facebamm schrieb:

    Gib nen converter online
    Aber nur nach VB.Net, nicht nach VBA.
    Und ob diese die yield-Statements richtig konvertieren, sei stark bezweifelt.

    Irgendwo hatte ich aber für VBA auch mal ein recht handliches Snippet veröffentlicht.
    Aber bevor @JB_ nicht preisgibt, was Sache ist, hat die Diskussion nur philosophischen Wert.

    Edit:
    hat sich überschnitten

    weil JB_ mittlerweilen schrieb:

    Ich programmiere in Visual Studio in Basic
    Also VB.Net.
    Dann solltest du den Thread in das richtige Forum verschieben lassen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Schreib mal oben in deinem Code (Zeile 1) "option strict on" und schmeiß mal den VisualBasic verweis raus.


    dann änderst du alle MsgBox zu MessageBox, denn MsgBox ist VB6 und alt.
    die Strings verbindest du per String.Concat :D
    den Dateipfad mit Path.Combine, denn dann musst du nicht immer "/" - schreiben

    bei weiteren Fehlern einfach Posten und wir helfen :D