Suche nach Dateien in Ordner und dann ausführen eines Befehls mit jeder Datei

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

Es gibt 42 Antworten in diesem Thema. Der letzte Beitrag () ist von wasserlasser.

    Suche nach Dateien in Ordner und dann ausführen eines Befehls mit jeder Datei

    Hallo zusammen,

    ich habe folgenden Code geschrieben

    VB.NET-Quellcode

    1. For Each foundFile As String In My.Computer.FileSystem.GetFiles(nhl09location, FileIO.SearchOption.SearchTopLevelOnly, "letters_*.fsh")
    2. ListBox1.Items.Add(foundFile)
    3. proc.StartInfo.UseShellExecute = False
    4. proc.StartInfo.RedirectStandardOutput = True
    5. proc.StartInfo.FileName = nhl09location & "\ImpBIG.exe"
    6. proc.StartInfo.Arguments = "/i gamedata\jerseys.viv letters_***_*.fsh letters_***_*.fsh /c"
    7. proc.Start()
    8. Dim Output As String = proc.StandardOutput.ReadToEnd
    9. proc.WaitForExit()
    10. Next


    Die ListBox habe ich als Kontrolle drin und dort sehe ich auch alle Dateien, die ich bearbeiten möchte.
    Nun soll das ganze aber für jede gefundene Datei die ImpBIG durchlaufen.
    Das macht das ganze leider nicht.

    Wo liegt der Denkfehler?

    Danke

    Wasserlasser
    Wozu

    wasserlasser schrieb:

    VB.NET-Quellcode

    1. My.Computer
    :?:
    @ErfinderDesRades meint dies:

    VB.NET-Quellcode

    1. For Each foundFile As String In New IO.DirectoryInfo(nhl09location).GetFiles("*.fsh", SearchOption.TopDirectoryOnly)
    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!

    ErfinderDesRades schrieb:

    Steht doch da
    Jou.

    wasserlasser schrieb:

    Als was muss ich das deklarieren?
    Sorry.

    VB.NET-Quellcode

    1. For Each foundFile As IO.FileInfo In New IO.DirectoryInfo(nhl09location).GetFiles("letters_*.fsh", System.IO.SearchOption.TopDirectoryOnly)
    2. ListBox1.Items.Add(foundFile.FullName)
    3. Dim proc As New Process
    Nur: Wozu verwendest Du foundFile.FullName?
    Das sollte doch eigentlich bei den Befehlsargumenten iwo vorkommen?
    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!

    wasserlasser schrieb:

    wo der Befehl folgender ist
    Dann musst Du diesen Befehl Zeichen für Zeichen übertragen. Dabei kann ich Dir leider nicht helfen. :/
    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!
    Mir geht es da eigentlich nur um den letzten Teil.
    Das ganze soll für jede Datei die dem Namen hier entspricht "letters_*.fsh" den Befehl ImpBIG /i gamedata\jerseys.viv %%i.fsh %%i.fsh /c ausführen. Die Werte %%i.fsh sind in dem Fall nur die Namen der Dateien.
    Also zum Beispiel letters_063_0.fsh
    Die werden ja in der Textbox mit dem Verzeichnis ausgegeben, das habe ich schon hin bekommen, aber in dem Bereich

    VB.NET-Quellcode

    1. proc.StartInfo.FileName = nhl09location & "\IMPBIG.exe"
    2. proc.StartInfo.Arguments = "/i gamedata\jerseys.viv letters_***_*.fsh letters_***_*.fsh /c"


    führt es das dann nicht aus.
    Kann man das Verzeichnis etc. irgendwie "abschneiden"?
    Die Ausgabe in der Listbox ist zum Beispiel so "K:\NHL 09\letters_063_0.fsh
    Also die Datei wird schon erkannt, aber eben mit dem Verzeichnis. Wenn ich das richtig verstehe wird ja dieser ganze Wert in den String "foundfile" geschrieben, oder?
    Wenn ich das da raus bekommen würde, dass nur noch der Dateiname da steht, dann kann ich den unten ja als variable angeben, oder?

    Gruss

    Wasserlasser
    Mein Problem hatte ich Dir ja schon beschrieben. Ich bin nicht wie Du ein Profi, sondern ein Anfänger. Ich versuche mich mit Google etc. durchzuschlagen. Wenn Du dann aber mit einem Einzeiler daher kommst, dann hilft mir das nicht. Es ist mir klar, dass diese Probleme für Dich wahrscheinlich so einfach sind wie für mich, wenn mich einer einen MSL ausrechnen lässt, aber ich habe da nichts davon. Genausowenig wie Du was davon hast wenn Du weisst ob ein AT oder BT Cut besser ist. Ich lerne da schon jeden Tag dazu, aber mit dem Satz von Dir kann ich nichts anfangen. Deswegen gehe ich natürlich auf Leute zu, die versuchen mir mit längeren Antworten zu helfen.

    gruss

    Wasserlasser

    wasserlasser schrieb:

    mit dem Satz von Dir kann ich nichts anfangen
    Mit welchem?
    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!
    Ich kann deinen Stand nicht genau wissen, daher muss ich drauf vertrauen, dass du fragst, wenn du was nicht verstehst.
    Andernfalls müsste ich jede Frage mit einem Komplett-Abriss der objektorientierten Programmierung beantworten, und da käme dasselbe Ergebnis raus: ich würde ignoriert - weils dann zuviel ist.
    Also nachfragen statt ignorieren.

    edit: @Rod: ich rückverwies auf post#2

    edit edit: aber ausserdem hab ich mich noch geirrt, man kann tatsächlich mit demselben Process-Objekt mehrere Programme abfahren.

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

    @ErfinderDesRades Dann hab ich mich irrtümlicherweise angesprochen gefühlt, weil @wasserlasser keinen von uns ansprach.
    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!
    @RodFromGermany
    Das war auf den Satz von EFD bezogen

    @ErfinderDesRades
    Meinen Programmierstand hatte ich ja schon in einem anderen Post beschrieben. Angefangen habe ich am 23.12.2014
    Daraufhin hattest Du gesagt, dass man lieber C# für Anfänger wie mich vorschlagen sollte, da man da nicht so viele Fehler machen kann - Daten aus einer Textdatei in einer Combobox darstellen
    Ich versuche wirklich erst alles raus zu finden was geht, aber hier hänge ich. Was ich machen will habe ich ja beschrieben. Deine Lösung hast Du ja gesagt würde auch nichts ändern, von dem her sind wir wieder am Anfang.

    Gruss

    Wasserlasser

    P.S. : Ich habe jetzt mal versucht das ganze direkt auf eine Datei anzulegen, aber auch wenn ich die letters_063_0.fsh fix eintrage geht es nicht. D.h. der Fehler muss wohl woanders liegen.

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

    wasserlasser schrieb:

    sind wir wieder am Anfang.
    Jo, tut mir leid :S

    Für den Anfang würde ichs mal mit einem einfacheren Programm versuchen als mit dem ImpBmp.exe und seiner schaurigen Kommandozeile.
    Bastel mal erstmal was, was dir soviele Notepads öffnet wie Elemente in deiner Liste sind.
    Bei mir zB geht Notepad ganz einfach so auf:

    VB.NET-Quellcode

    1. Dim proc = New Diagnostics.Process
    2. proc.StartInfo.FileName = "notepad.exe"
    3. proc.Start()
    4. proc.WaitForExit()


    Als nächstes probier ein ImpBmp zu starten.

    Also Herantasten, oder auch "entwickeln", wie man so schön sagt ;)
    @ErfinderDesRades
    Ich habe da jetzt mal was "lustiges" probiert. Ich habe den Code so geändert:

    VB.NET-Quellcode

    1. Private Sub AddOnsInstallierenButton_Click(sender As Object, e As EventArgs) Handles AddOnsInstallierenButton.Click
    2. 'Sucht NHL 2009
    3. Dim nhl09location As Object
    4. 'Dim proc As Process = New Process()
    5. nhl09location = My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\nhl2009.exe", "Path", Nothing)
    6. NHL2009Location.Text = nhl09location
    7. For Each foundFile As String In My.Computer.FileSystem.GetFiles(nhl09location, FileIO.SearchOption.SearchTopLevelOnly, "letters_*.fsh")
    8. Dim proc = New Diagnostics.Process
    9. proc.StartInfo.FileName = "notepad.exe"
    10. proc.Start()
    11. proc.WaitForExit()
    12. Next
    13. End Sub


    Da ich im Moment 4 Dateien mit dem Format "letters_*.fsh" im Ordner habe, öffnet er nun vier mal Notepad :)
    Also die Zahl stimmt schon und er findet die Dateien.

    Wenn ich meinen "Originalcode" nehme, dann startet er auch vier mal ein Dos Fenster und versucht den Befehl auszuführen, aber das macht er dann doch irgendwie falsch.
    Ich denke, dass irgendwo in der Zusammensetzung zwischen dem Dateinamen und dem Befehl ein Problem liegt.
    Muss ich für den Befehl selber nochmal den Pfad eingeben wo das dann gemacht werden soll oder findet das Program dann den Ordner gamedata, da er sich ja im Ordner von IMPBIG befindet?

    Gruss

    Wasserlasser
    @ErfinderDesRades
    Ich bin weiter am testen.
    In der CMD Box kann ich das alles mit dem Befehl ImpBIG /i gamedata\jerseys.viv letters_118_1.fsh letters_118_1.fsh /c ausführen und es installiert alles.

    Mache ich das aber in meinem Code so, dann geht es nicht

    VB.NET-Quellcode

    1. Private Sub AddOnsInstallierenButton_Click(sender As Object, e As EventArgs) Handles AddOnsInstallierenButton.Click
    2. 'Sucht NHL 2009
    3. Dim nhl09location As Object
    4. Dim proc As Process = New Process()
    5. nhl09location = My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\nhl2009.exe", "Path", Nothing)
    6. NHL2009Location.Text = nhl09location
    7. For Each foundFile As String In My.Computer.FileSystem.GetFiles(nhl09location, FileIO.SearchOption.SearchTopLevelOnly, "letters_*.fsh")
    8. ListBox1.Items.Add(foundFile)
    9. proc.StartInfo.UseShellExecute = False
    10. proc.StartInfo.RedirectStandardOutput = True
    11. proc.StartInfo.FileName = nhl09location & "IMPBIG.exe"
    12. proc.StartInfo.Arguments = "/i gamedata\jerseys.viv letters_118_1.fsh letters_118_1.fsh /c"
    13. proc.Start()
    14. Dim Output As String = proc.StandardOutput.ReadToEnd
    15. proc.WaitForExit()
    16. Next
    17. End Sub


    Durch Breakpoints habe ich raus gefunden, dass der Pfad zum FileName stimmt, aber ich weiss nicht ob es dann das Argument einfach an die IMPBIG.exe hinten dran hängt oder wie es das dann ausführt.
    Kann man das auch irgendwie über was ähnliches wie Breakpoints raus finden?

    Gruss

    Wasserlasser
    Was mir hier auffällt, du gibts die Dateien relativ an, das bedeutet sie werden im Arbeitsverzeichnis gesucht. In deinem Code setzt du aber nirgends das Arbeitsverzeichnis, es wird also das Arbeitsverzeichnis der startenden Anwendung (also deiner) verwendet. Befindet diese sich im selben Verzeichnis? Wenn nicht ists klar, dass nix läuft.
    @Artentus

    So sollte es aussehen.
    Die Dateien impbig.exe und letters_118_1.fsh liegen im Ordner der durch nhl09location gesucht wird.
    Der Befehl

    VB.NET-Quellcode

    1. proc.StartInfo.Arguments = "/i gamedata\jerseys.viv letters_118_1.fsh letters_118_1.fsh /c"
    ist ja das, was IMPBIG dann als Befehl aufnimmt.
    Die Datei jersey.viv ist im Unterordner gamedata, der sich auch im Ordner nhl09location befindet.
    Durch den IMPBIG Befehl wird in der Datei jerseys.viv die Datei letters_118_1.fsh mit der neuen letters_118_1.fsh aus dem nhl09location Ordner überschrieben.

    Das ganze schaut laut IMPBIG Beschreibung so aus:
    imbig /i [bigfile] [internalfile] [sourcefile]
    bigfile = jerseys.viv
    internalfile = letters_118_1.fsh die sich in der jerseys.viv befindet
    sourcefile = letters_118_1.fsh die sich im Ordner nhl09location befindet.

    Gruss

    Wasserlasser