Dateizugriff nach Upload

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

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von DannyWave.

    Dateizugriff nach Upload

    Hallo Freunde,

    ich habe ein kleines Problem:

    Ich benutze die Webbrowser Komponente. Auf einem Web-Portal kann ich eine Datei zum hochladen auswählen und tue das auch.
    Sobald der Upload fertig ist, wird der Browser meinerseits disposed und geschlossen.
    Die Datei, welche hochgeladen wurde, lässt sich aber nicht löschen.
    Irgendwie bleibt da eine Referenz offen, obwohl ich den Browser wie gesagt disposed und derefenziet habe.

    Erst nach Beendigung der Form lässt sich die Datei löschen.

    Was kann ich tun?
    Wie sieht denn Dein Code aus?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Der Upload wird automatisch getriggert. Hier der Code.

    VB.NET-Quellcode

    1. Private Sub upload(ByVal pIndex As Integer)
    2. 'Trigger Upload
    3. Task.Factory.StartNew(Sub()
    4. Runpartner.INSTANCE.Invoke(Sub()
    5. getElementByTagName("input", "type", "file").click() 'blocking window
    6. End Sub)
    7. End Sub)
    8. 'Fill Dialog
    9. Task.Factory.StartNew(Sub()
    10. While True
    11. GetActiveWindows()
    12. For Each myText As String In mList
    13. If myText.ToLower.Contains("datei zum hochladen auswählen") _
    14. OrElse myText.ToLower.Contains("choose file to upload") Then
    15. Exit While
    16. End If
    17. Next
    18. Threading.Thread.Sleep(100)
    19. End While
    20. Runpartner.INSTANCE.Invoke(Sub()
    21. My.Computer.Clipboard.SetText(mTasks(pIndex))
    22. SendKeys.Send("^V")
    23. SendKeys.Send("{ENTER}")
    24. End Sub)
    25. End Sub)
    26. 'Wait for Upload complete
    27. Task.Factory.StartNew(Sub()
    28. While Runpartner.INSTANCE.Invoke(Function() As Integer
    29. Return getElementByID("afu-upload-files").getHTMLElement.Children.Count
    30. End Function) <= pIndex + 1 'after upload, there is one more field
    31. Threading.Thread.Sleep(100)
    32. End While
    33. Runpartner.INSTANCE.Invoke(Sub() 'upload complete, what next?
    34. If pIndex + 1 < mTasks.Count Then
    35. 'GoTo NextFile <- not working from thread context
    36. upload(pIndex + 1)
    37. ElseIf pIndex = Integer.MaxValue Then
    38. 'exit
    39. Else
    40. getElementByID("submitbutton").click()
    41. getElementsByTagName("button", "type", "button").ElementAt(1).click()
    42. End If
    43. End Sub)
    44. End Sub)
    45. End Sub


    Nach Abschluss

    VB.NET-Quellcode

    1. mBrowser.Dispose()
    2. mBrowser = Nothing


    und zu guter letzt:

    VB.NET-Quellcode

    1. Try
    2. My.Computer.FileSystem.DeleteDirectory(myFolder, FileIO.DeleteDirectoryOption.DeleteAllContents)
    3. Catch myEx As Exception
    4. Tracer.postData(myEx)
    5. End Try


    Wenn ich mich per Debugger einklinke kann ich feststellen, dass erst ab Upload kein manuelles Löschen aufgrund der Berechtigung möglich ist. Das ändert sich danach auch nicht mehr. Die Fehlermeldung von DeleteDirectory ist "Das Verzeichnis ist nicht leer"
    Moment. Der Fehler ist nur bei DeleteDirectory oder kannst Du dann die Datei dann auch wirklich nicht löschen? Also manuell im Explorer. Ersteres scheint die Verhaltensweise von My.Computer.FileSystem.DeleteDirectory zu sein, was natürlich ungünstig ist. Nimm da mal stattdessen System.IO.Directory.Delete. My-Namespace ist bei sowas immer böse.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Richtig, der Fehler ist nur bei DeleteDirectory. Wie gesagt habe ich mit Breakpoints versucht herauszufinden, ab wann die Datei schreibgeschützt ist. Dazu habe ich immer wieder versucht, sie im Explorer manuell zu löschen. Genau das ging ab Upload nicht mehr, weshalb System.IO.Directory.Delete auch nicht helfen wird.

    Trotzdem werde ich System.IO anstelle von My.Computer.Filesystem verwenden, wenn du sagst dass das besser ist.

    Also: wie kille ich alles was mit der Webbrowser-Komponente zu tun hat, sodass jegliche Referenz verloren geht?

    Edit: Da hätte ich auch früher drauf kommen können.

    Visual Basic-Quellcode

    1. Try
    2. GC.Collect()
    3. GC.WaitForPendingFinalizers()
    4. Catch ex As Exception
    5. End Try

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