Datei noch in nutzung.

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

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Yanbel.

    Datei noch in nutzung.

    Hallo,

    ich habe ein Problem, und habe leider noch keine richtige Lösung gefunden.
    Ich mach eine Übertragung per cmd und erzeuge eine Logdatei und diese will ich auslesen aber leider passiert es manchmal das die Datei noch blockiert wird von dem anderen Prozess. Ich habe auch schon ein Timer eingebaut der den Fehler zu 90% löst aber leider nicht zu 100% hat jemand noch eine Idee?

    Und ich muss leider auch warten bis die Logdatei fertig geschrieben wurde ob es fehler gab. Weil manchmal dauert es einfach lange, da die Dateien ziemlich groß sind.

    Danke schon mal.
    Nachtrag über die Suche habe leider nix gefunden was mir helfen konnte.
    @miles1980 Mit welchem Code schreibst Du in die Datei?
    Mit diesen Methoden solltze es funktionieren:
    docs.microsoft.com/de-de/dotne…ext?view=netframework-4.8
    docs.microsoft.com/de-de/dotne…nes?view=netframework-4.8
    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, ich schreib die Logdatei über den CMD comand, ganz simple gehalten.

    Ich muss die Datei lesen, aber wenn mein Cmd fertig erst.
    Oder gibt es ein möglichkeit zuwarten bis mein CMD erledigt?

    VB.NET-Quellcode

    1. Dim file As String = mydocpath & Convert.ToString("ftp.bat")
    2. Dim startInfo As New System.Diagnostics.ProcessStartInfo(file)
    3. startInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(file)
    4. startInfo.WindowStyle = ProcessWindowStyle.Hidden
    5. System.Diagnostics.Process.Start(startInfo)
    @miles1980 Ich fragte nach dem expliziten Code.
    Ohne Deinen Code kann Dir nicht geholfen werden.
    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!
    Logdatei wird so erzeugt per CMD, in der BAT Datei:

    ftp -i -s: C:\temp\Artikel.BAT > C:\temp\archiv\Protokoll.txt

    VB.NET-Quellcode

    1. For Each ftpLine As String In System.IO.File.ReadLines(fileName)
    2. Dim Check As String = String.Empty
    3. If ftpLine <> String.Empty Then
    4. Check = ftpLine.Substring(0, 3)
    5. End If


    Versuch die Datei zu öffnent landet er im Catch.

    so okay @RodFromGermany ?
    Setz doch mal einen Brechpunkt (Zeile anklicken und F9 drücken) an die Stelle wo die Datei eingelesen wird. Dann stepst du die Zeilen mit der F10-Taste durch (oder mit F8 wenn du in Unterfunktionen springen musst) und dann schau bei welcher Zeile er in das Catch springt.

    Das war die stark vereinfachte Variante, hier im Forum gibt es aber auch noch ein Tutorial zum richtigen Debuggen und Fehler finden: Debuggen, Fehler finden und beseitigen


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

    miles1980 schrieb:

    so okay
    Besser.
    Was isn ftp für ein Programm?
    Schreibt das gemütlich das Protokoll oder gibt es da ein definiertes Ende?
    Das müsstest Du dann abwarten.
    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!
    @Yanbel das problem ist eindeutig das die Datei noch geschrieben wird bevor ich zugreife. (in 10% ungefähr). ich nach einer besseren Methode. Ich bin auch am überlegen ob ich nicht über "System.Diagnostics.Process.GetProcesses" den namen bekomme. Die ersten kurzen test zeigen nein. Ich bekomme nur CMD anzeigt. Ich würde gerne beim starten ein Prozessnamen übergeben habe ich aber noch nicht gefunden, weil sonst hätte ich das problem nicht mehr.
    Damit kannst du vielleicht was anfangen. Ich weiß nicht ob das Einlesen der Datei bei dir asynchron ablaufen darf. Falls ja, dann funktioniert der das hier:

    VB.NET-Quellcode

    1. Private Sub Start_Click(sender As Object, e As EventArgs) Handles btnStart.Click
    2. Dim Filename As String = "C:\temp\archiv\Protokoll.txt"
    3. Task.Factory.StartNew(Sub()
    4. Dim CheckForCompleted As Boolean = False
    5. Do While Not CheckForCompleted
    6. Try
    7. Using xStream As New IO.StreamReader(Filename)
    8. Dim test As String = xStream.ReadLine
    9. CheckForCompleted = True
    10. Me.Invoke(Sub()
    11. Read(Filename)
    12. End Sub)
    13. End Using
    14. Catch ex As Exception
    15. End Try
    16. Loop
    17. End Sub)
    18. End Sub
    19. Private Sub Read(Filename As String)
    20. For Each ftpLine As String In System.IO.File.ReadLines(Filename)
    21. Dim Check As String = String.Empty
    22. If ftpLine <> String.Empty Then
    23. Check = ftpLine.Substring(0, 3)
    24. End If
    25. Next
    26. End Sub


    Musst du natürlich für dich anpassen ;)


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    Okay... dann halt synchron:

    VB.NET-Quellcode

    1. Dim Filename As String = "C:\temp\archiv\Protokoll.txt"
    2. Dim CheckForCompleted As Boolean = False
    3. Do While Not CheckForCompleted
    4. Try
    5. Using xStream As New IO.StreamReader(Filename)
    6. Dim test As String = xStream.ReadLine
    7. CheckForCompleted = True
    8. xStream.Close()
    9. End Using
    10. Catch ex As Exception
    11. End Try
    12. Loop
    13. For Each ftpLine As String In System.IO.File.ReadLines(Filename)
    14. Dim Check As String = String.Empty
    15. If ftpLine <> String.Empty Then
    16. Check = ftpLine.Substring(0, 3)
    17. End If
    18. Next


    Ist natürlich blöd weil die Maske dann einfriert. Aber wenn es synchron laufen muss, dann sehe ich aktuell keinen anderen Weg.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.