Warten bis Function vollständig durchlaufen?

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

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von xChRoNiKx.

    Warten bis Function vollständig durchlaufen?

    In Meinem Programm soll eine Datei erstellt werden und im nächsten Schritt diese bearbeitet werden.
    Mein Code:

    VB.NET-Quellcode

    1. Private Sub gdt_function()
    2. create_empty_gdt()
    3. For Each SelectedFile In SelectedFileName
    4. If (SelectedFile.Contains("_c")) Then
    5. Dim Stringlenght As Integer = (SelectedFile.Length - 2)
    6. 'remove _c from filename
    7. Dim materialname As String = SelectedFile.Remove(Stringlenght)
    8. create_material(materialname, True)
    9. End If
    10. ProgressBar1.Value = ProgressBar1.Value + 1
    11. Next
    12. End Sub


    Mit create_empty_gdt() wird eine Datei erstellt, die mit einem Text beschrieben ist.
    Mit der Funktion create_material() wird die soeben erstellte Datei geöffnet und bearbeitet.
    Allerdings versucht create_material() zu schnell die Datei zu öffnen und Visual Studio sagt mir die Datei ist nicht vorhanden.
    Gibt es eine Möglichkeit zu warten, bis create_empty_gdt() durchlaufen ist und erst dann weiter im Programm zu gehen?
    Habe es mit Do Until versucht allerdings erstellt er mir da nur die Datei und macht danach nicht im Programm weiter.
    Hoffe jemand kann mir dabei helfen :D
    Eigentlich sollte dein Programm dies schon tun. Hier impliziert nichts das es ausgeführt und vergessen wird sondern es wird
    alles nacheinander abgearbeitet.

    Schau dir mal an ob in "materialname" wirklich das drin steht was du erwartest vielleicht ist da was am Pfad / Dateinamen nicht ganz richtig.

    /EDIT//
    Außerdem wäre es sehr Hilfreich wenn du uns den Inhalt von "create_material" und "create_empty_gdt" mal noch mit rein schmeißt.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

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

    Ist vielleicht etwas unübersichtlich ^^

    Die sache ist es funktioniert ja wenn ich create_empty_gdt() weg lasse und die Datei manuell erstelle.

    VB.NET-Quellcode

    1. Private Sub create_empty_gdt()
    2. Dim path As String = My.Settings.rootpath + "\source_data\" + My.Settings.gdtname
    3. Dim file As System.IO.StreamWriter
    4. file = My.Computer.FileSystem.OpenTextFileWriter(path + ".gdt", True)
    5. file.WriteLine("{")
    6. file.WriteLine("~")
    7. file.WriteLine("}")
    8. file.Close()
    9. 'wait_for_create_gdt = True
    10. End Sub
    11. Private Sub create_material(ByVal material_name As String, ByVal newgdt As Boolean)
    12. Dim material_template = IO.File.ReadAllText("D:\Visual Studio Stuff\fiber_material_template.gdt")
    13. 'name
    14. material_template = material_template.Replace("testmaterial", material_name)
    15. 'material category
    16. material_template = material_template.Replace("test_material_category", My.Settings.material_category)
    17. 'material type
    18. material_template = material_template.Replace("test_material_type", My.Settings.material_type)
    19. 'surface type
    20. material_template = material_template.Replace("test_surface_type", My.Settings.surface_type)
    21. 'gloss surface type
    22. material_template = material_template.Replace("test_gloss_surface_type", My.Settings.gloss_range)
    23. 'usage
    24. material_template = material_template.Replace("test_usage", My.Settings.usage)
    25. 'IO.File.WriteAllText(My.Settings.GDTFullPath, material_template)
    26. IO.File.WriteAllText(My.Application.Info.DirectoryPath + "\material_placeholder.gdt", material_template)
    27. If (newgdt = True) Then
    28. Dim gdt_path As String = My.Settings.rootpath + "\source_data\" + My.Settings.gdtname
    29. Dim new_material_infos = IO.File.ReadAllText(My.Application.Info.DirectoryPath + "\material_placeholder.gdt")
    30. Dim new_gdt = IO.File.ReadAllText(gdt_path)
    31. new_gdt = new_gdt.Replace("~", new_material_infos)
    32. IO.File.WriteAllText(My.Settings.GDTFullPath, new_gdt)
    33. End If
    34. End Sub

    Heyho,

    ok. Fangen wir mal damit an.

    Erstmal wenn du Pfade verknüpfen willst nutze mal Path.Combine das ist extra dafür gemacht. So sind Fehler ausgeschlossen die
    auf nen verhunzten Pfad aufbauen. Beispiel von mir:

    VB.NET-Quellcode

    1. Dim _pfadDatei As String = System.IO.Path.Combine(Environment.CurrentDirectory, "meinOrdner1", "meinOrder2", "datei.txt")
    2. 'in meinem Fall:
    3. 'F:\Programmieren\VisualStudioProjekte\WindowsApp8\WindowsApp8\bin\Debug\meinOrdner1\meinOrder2\datei.txt


    Dann solltest du für den StreamWriter Using nutzen. Beispiel :

    VB.NET-Quellcode

    1. Using sw As New System.IO.StreamWriter("test.txt")
    2. sw.WriteLine("Line1")
    3. sw.WriteLine("Line2") 'usw
    4. End Using


    Du öffnest in deiner Funktion: "D:\Visual Studio Stuff\fiber_material_template.gdt" diese Datei.
    Schreiben tust du in: "My.Settings.rootpath + "\source_data\" + My.Settings.gdtname" ist das auch der gleiche Pfad? sieht für mich nicht danach aus.

    EDIT/ ich sehe noch If (newgdt = True) Then sollte damit der obere Teil hinfällig sein muss diese If-Abfrage an den Anfang und alles andere in den Else teil weil
    sonst natürlich klar ist das er bei True das Material nicht findet da es ja neu ist.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Okay gut zu wissen mit Combine :D
    Also ich öffne mit "D:\Visual Studio Stuff\fiber_material_template.gdt" eine datei die später im Pfad bei der Ausführbaren .exe liegt.
    In dieser Datei stehen 990 zeilen Code der immer gleich sein soll. Ich öffne diesen langen Code ersetze einzelne Einträge mit meinen Replace-Funktionen und speicher die fertige Datei in ein neues verzeichnes,
    welches vorher vom Benutzer definiert ist.
    Ok,

    dann stelle nun mal sicher das auch wirklich das alles dadrin steht was drin stehen soll.

    Also Haltepunkt setzten in der IDE und dir die Pfad sachen anschauen und evtl. mal die ganze Fehlermeldung posten vielleicht liegt dein Fehler ja ganz woanders.
    Normalerweise steht da in der Fehlermeldung Datei nicht gefunden auch der Pfad den er nehmen will evtl. ist das ja gar nicht der den du haben willst.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Das freut mich, wenn du nun auch meine Tipps umgesetzt hast freut es mich umso mehr.

    Dann markiere doch auch noch deinen Thread als gelöst. Dies machst du wenn du hier im Thema bist oben neben den Thread-Titel
    diese kleine Rote Box diese mal anklicksen.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen