Prozess kann nicht auf Datei zugreifen?

  • VB.NET
  • .NET (FX) 4.0

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Prozess kann nicht auf Datei zugreifen?

    Hallo zusammen

    Vorweg ich hab leider nichts gefunden was mich bei meinem Problem weiterbringt falls ich also etwas übersehen habe entschuldigt bitte aber dann hab ich es bei meinen Suchen komplett "verpasst"...

    Mein Problem ist das ich Dateien erst Downloade und diese dann an einen bestimmten Punkt kopieren/überschreiben möchte.
    zu diesen Zweck verwende ich folgenden Code:

    VB.NET-Quellcode

    1. Private Sub File_Copy(ByVal sourcePath As String, ByVal destinationPath As String)
    2. Dim sourceDirectoryInfo As New System.IO.DirectoryInfo(sourcePath)
    3. If Not System.IO.Directory.Exists(destinationPath) Then
    4. System.IO.Directory.CreateDirectory(destinationPath)
    5. End If
    6. Dim fileSystemInfo As System.IO.FileSystemInfo
    7. For Each fileSystemInfo In sourceDirectoryInfo.GetFileSystemInfos
    8. Dim destinationFileName As String = System.IO.Path.Combine(destinationPath, FileSystemInfo.Name)
    9. If TypeOf fileSystemInfo Is System.IO.FileInfo Then
    10. If System.IO.File.Exists(destinationFileName) Then
    11. End If
    12. System.IO.File.Copy(fileSystemInfo.FullName, destinationFileName, True)
    13. Else
    14. File_Copy(fileSystemInfo.FullName, destinationFileName)
    15. End If
    16. Next
    17. End Sub​


    Zum Testen habe ich ein Verzeichnis mit einigen Bildern und Unterordnern gewählt und ein leeres Test Verzeichnis als Ziel.
    Doch sobald der Prozess startet bekomme ich immer die Fehlermeldung das eine Datei bereits von einem Prozess verwendet wird?!

    Habe ich einen dermaßen großen Schnitzer in dem Code gebastelt das dass nicht funktionieren kann?
    Danke im voraus für eure Hilfe

    Gruß
    Panics

    Panics schrieb:

    ein leeres Test Verzeichnis als Ziel.
    Das dürfte dann nicht stimmen.

    Panics schrieb:

    VB.NET-Quellcode

    1. If TypeOf fileSystemInfo Is System.IO.FileInfo Then
    Hier dürfte immer False rauskommen.
    In welcher Zeile knallt es?
    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!
    Es Funktioniert soweit nur hier scheitert es:

    VB.NET-Quellcode

    1. System.IO.File.Copy(fileSystemInfo.FullName, destinationFileName, True)


    Fehlermeldung:
    Zusätzliche Informationen: Der Prozess kann nicht auf die Datei "D:\Test\Bilder\IMG_5683.jpg" zugreifen, da sie von einem anderen Prozess verwendet wird.


    Alle Unterverzeichnisse dazu wurden automatisch angelegt aber irgendwas stimmt da nicht...
    Den Aufruf mache ich so:

    VB.NET-Quellcode

    1. File_Copy(Directory.GetCurrentDirectory() & "\Bilder", "D:\Test")


    Lustiger weise Wurde die Datei zu diesem Zeitpunkt bereits angelegt..
    Das Problem ist ich muss alle Dateien und Verzeichnisse Kopieren und da kommen eine ganze Menge Unterverzeichnisse zusammen.
    Auch müssen Dateien hin und wieder für Aktualisierungen bestimmter Dateien überschrieben werden.

    Panics schrieb:

    VB.NET-Quellcode

    1. File_Copy()
    wie oben?
    Setz da mal einen Haltepunkt rein, steppe das ganze zeilenweise durch und beobachte gleichzeitig das Ausgabeverzeichnis.
    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!

    Panics schrieb:

    Wie meinst du?
    Ich hatte Dir oben geschrieben, dass bei

    VB.NET-Quellcode

    1. If TypeOf fileSystemInfo Is System.IO.FileInfo Then
    immer False rauskommt.
    Hast Du das berücksichtigt bzw. korrigiert?
    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 hab diese Zeile in diese Zeile hier geändert:

    VB.NET-Quellcode

    1. ​If Not System.IO.File.Exists(destinationFileName) Then


    Das lustige ist jetzt bekomme ich diese Fehlermeldung hier:
    ​Zusätzliche Informationen: Der Zugriff auf den Pfad "C:\Users\Panics\Documents\Visual Studio 2013\Projects\Excore Launcher\Excore Launcher\bin\Release\Bilder" wurde verweigert.


    Die Anwendung sollte eigentlich nicht als Administrator laufen nur woher kommt das plötzlich?

    Panics schrieb:

    Administrator
    ist nicht das Problem.
    Poste mal den kompletten Code.
    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!
    Was meinst du mit Kompletten Code?
    Oben steht ja bereits der Komplette Code für das Kopieren oder meinst du von der ganzen Anwendung?
    Falls du den Code der Anwendung meinst wird das etwas sehr lang und mir nicht ganz so lieb xD

    Falls du den geänderten Code für das Kopieren meinst kann ich dies gerne tun:

    VB.NET-Quellcode

    1. Private Sub File_Copy(ByVal sourcePath As String, ByVal destinationPath As String)
    2. Dim sourceDirectoryInfo As New System.IO.DirectoryInfo(sourcePath)
    3. If Not System.IO.Directory.Exists(destinationPath) Then
    4. System.IO.Directory.CreateDirectory(destinationPath)
    5. End If
    6. Dim fileSystemInfo As System.IO.FileSystemInfo
    7. For Each fileSystemInfo In sourceDirectoryInfo.GetFileSystemInfos
    8. Dim destinationFileName As String = System.IO.Path.Combine(destinationPath, fileSystemInfo.Name)
    9. If Not System.IO.File.Exists(destinationFileName) Then
    10. Try
    11. System.IO.File.Copy(fileSystemInfo.FullName, destinationFileName, True)
    12. Catch ex As IO.IOException
    13. End Try
    14. Else
    15. File_Copy(fileSystemInfo.FullName, destinationFileName)
    16. End If
    17. Next
    18. End Sub

    Panics schrieb:

    Was meinst du mit Kompletten Code?
    Mehr als Deine Prozedur, die Aufruf-Umgebung gehört auch dazu.
    Am besten, Du postest das komplette Projekt.
    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!
    Also das Komplette Project werde ich nicht posten aber ich kann alles was in direkter Verbindung dazu steht posten.

    1. Der Download der Dateien

    VB.NET-Quellcode

    1. #Region "New Download Thread"
    2. Private m_Process As Process
    3. Private m_OutputThread As Thread
    4. Private m_ErrorThread As Thread
    5. Private m_strTextToAdd As String
    6. Public Sub rsync_stuff2()
    7. Progressor = 2
    8. sFile = 0
    9. If System.IO.Directory.Exists(Directory.GetCurrentDirectory() & "/ModBase") = False Then
    10. System.IO.Directory.CreateDirectory(Directory.GetCurrentDirectory() & "/ModBase")
    11. End If
    12. Dim cygdrive As String = """/cygdrive/" + Directory.GetCurrentDirectory().Remove(1, 1).Replace("\", "/") + """"
    13. m_Process = New Process()
    14. With m_Process.StartInfo
    15. .FileName = Directory.GetCurrentDirectory() + "\rsync\rsync.exe"
    16. .Arguments = " -htrvz --del --progress --stats domain.tls::excore " & cygdrive & "/ModBase"
    17. .CreateNoWindow = True
    18. .UseShellExecute = False
    19. .RedirectStandardOutput = True
    20. .RedirectStandardError = True
    21. .RedirectStandardInput = True
    22. End With
    23. m_Process.Start()
    24. Dim ts1 As ThreadStart = New ThreadStart(AddressOf StreamOutput)
    25. m_OutputThread = New Thread(ts1)
    26. m_OutputThread.Start()
    27. Dim ts2 As ThreadStart = New ThreadStart(AddressOf StreamError)
    28. m_ErrorThread = New Thread(ts2)
    29. m_ErrorThread.Start()
    30. End Sub
    31. Public Sub rsync_stuff()
    32. Progressor = 1
    33. sFiles = 0
    34. If System.IO.Directory.Exists(Directory.GetCurrentDirectory() & "/ModBase") = False Then
    35. System.IO.Directory.CreateDirectory(Directory.GetCurrentDirectory() & "/ModBase")
    36. End If
    37. Dim cygdrive As String = """/cygdrive/" + Directory.GetCurrentDirectory().Remove(1, 1).Replace("\", "/") + """"
    38. m_Process = New Process()
    39. With m_Process.StartInfo
    40. .FileName = Directory.GetCurrentDirectory() + "\rsync\rsync.exe"
    41. .Arguments = " -htrvzn --del --progress --stats domain.tls::excore " & cygdrive & "/ModBase"
    42. .CreateNoWindow = True
    43. .UseShellExecute = False
    44. .RedirectStandardOutput = True
    45. .RedirectStandardError = True
    46. .RedirectStandardInput = True
    47. End With
    48. m_Process.Start()
    49. Dim ts1 As ThreadStart = New ThreadStart(AddressOf StreamOutput)
    50. m_OutputThread = New Thread(ts1)
    51. m_OutputThread.Start()
    52. Dim ts2 As ThreadStart = New ThreadStart(AddressOf StreamError)
    53. m_ErrorThread = New Thread(ts2)
    54. m_ErrorThread.Start()
    55. End Sub
    56. Private Sub StreamInput(ByVal strText As String)
    57. m_Process.StandardInput.WriteLine(strText)
    58. m_Process.StandardInput.Flush()
    59. End Sub
    60. Private Sub StreamError()
    61. Dim strLine As String = _
    62. m_Process.StandardError.ReadLine()
    63. Try
    64. Do While strLine.Length >= 0
    65. strLine = m_Process.StandardError.ReadLine()
    66. If strLine.Length <> 0 Then
    67. AddText(strLine)
    68. End If
    69. Loop
    70. Catch
    71. AddText("Download Vorgang wurde beendet!")
    72. End Try
    73. End Sub
    74. Private Sub StreamOutput()
    75. Dim strLine As String = m_Process.StandardOutput.ReadLine()
    76. Try
    77. Do While strLine.Length >= 0
    78. If strLine.Length <> 0 Then
    79. AddText(strLine)
    80. End If
    81. strLine = m_Process.StandardOutput.ReadLine()
    82. Loop
    83. Catch
    84. AddText("Download Vorgang wurde beendet!")
    85. If Progressor = 2 Then
    86. 'Game_Check()
    87. File_Copy(Directory.GetCurrentDirectory() & "\ModBase", "D:\Test")
    88. End If
    89. End Try
    90. End Sub
    91. Private Sub AddText(ByVal strText As String)
    92. m_strTextToAdd = strText
    93. Me.Invoke(CType(AddressOf Me.AddTextToTextBox, MethodInvoker))
    94. End Sub
    95. Private Sub AddTextToTextBox()
    96. Search = "[0-9]{1,3}\%"
    97. Search2 = "\w\S+\.(pbo|bisign|paa|ini|dll|tml|cpp|jpg)"
    98. Search3 = "to-check=.*?\>"
    99. Search4 = "Number of files:"
    100. rgx4 = New Regex(Search2)
    101. rgx5 = New Regex(Search)
    102. rgx6 = New Regex(Search3)
    103. rgx7 = New Regex(Search4)
    104. Hits = rgx4.Matches(m_strTextToAdd)
    105. Hits2 = rgx5.Matches(m_strTextToAdd)
    106. Hits3 = rgx6.Matches(m_strTextToAdd)
    107. Hits4 = rgx7.Matches(m_strTextToAdd)
    108. If Hits2.Count = 0 Then
    109. Else
    110. Trigger = 322 / 100 * Hits2.Item(0).ToString.Replace("%", "")
    111. CBar.Width = Trigger
    112. If Progressor = 2 Then
    113. GBar.Width = 322 / sFiles * sFile
    114. End If
    115. End If
    116. If Hits.Count = 0 Then
    117. CBarL.Visible = True
    118. CBarL.Text = String.Concat(m_strTextToAdd)
    119. CBarL.Text = CBarL.Text.Replace(" ", "")
    120. CBarL.Text = CBarL.Text.Replace(" ", "")
    121. CBarL.Text = CBarL.Text.Replace(" ", " - ")
    122. CBarL.Text = CBarL.Text.Replace(" ", " - ")
    123. CBarL.Text = CBarL.Text.Replace(" ", " - ")
    124. Else
    125. If Progressor = 0 Or Progressor = 1 Then
    126. sFiles = sFiles + 1
    127. ElseIf Progressor = 2 Then
    128. sFile = sFile + 1
    129. End If
    130. GBarL.Visible = True
    131. Resulting = Split(m_strTextToAdd, "/")
    132. GBarL.Text = "Downloade - " & sFile & " von " & sFiles
    133. End If
    134. If Hits3.Count = 0 Then
    135. Else
    136. MsgBox(Hits3.Item(0).ToString)
    137. End If
    138. If Hits4.Count = 0 Then
    139. Else
    140. If Progressor = 0 Or Progressor = 1 Then
    141. rsync_stuff2()
    142. End If
    143. End If
    144. End Sub
    145. #End Region​


    2. der Kopiervorgang:

    VB.NET-Quellcode

    1. ​#Region "Copy Transfer"
    2. Private Sub File_Copy(ByVal sourcePath As String, ByVal destinationPath As String)
    3. Dim Path As DirectoryInfo = New DirectoryInfo(sourcePath)
    4. GBarL.Invoke(Sub() GBarL.Visible = True)
    5. Dim sourceDirectoryInfo As New System.IO.DirectoryInfo(sourcePath)
    6. If Not System.IO.Directory.Exists(destinationPath) Then
    7. System.IO.Directory.CreateDirectory(destinationPath)
    8. End If
    9. Dim fileSystemInfo As System.IO.FileSystemInfo
    10. For Each fileSystemInfo In sourceDirectoryInfo.GetFileSystemInfos
    11. Dim destinationFileName As String = System.IO.Path.Combine(destinationPath, fileSystemInfo.Name)
    12. If Not System.IO.File.Exists(destinationFileName) Then
    13. Try
    14. System.IO.File.Copy(fileSystemInfo.FullName, destinationFileName, True)
    15. Catch ex As IO.IOException
    16. MsgBox(ex.ToString)
    17. End Try
    18. Else
    19. File_Copy(fileSystemInfo.FullName, destinationFileName)
    20. End If
    21. Next
    22. End Sub
    23. #End Region


    Der Aufruf des Downloads wird relativ Simpel mit einem Button gestartet:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. rsync_stuff()
    3. End Sub


    Ich weiß das vieles wahrscheinlich besser gelöst werden kann...
    Leider beherrsche ich das ganze nur nicht besser :/

    Panics schrieb:

    in direkter Verbindung
    75 Fehler.
    Kopiere mal diesen Code in ein neues Projekt und mach es lauffähig.
    Dieses Projekt kannst Du dann anhängen.
    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 hab das Test Projekt nun angelegt und an gehangen.
    Du wirst selber einige Dateien in das Verzeichnis "ModBase" kopieren müssen oder einen rsync Server aufsetzen...
    Ich könnte dir auch den Zugriff auf meinen Server Privat schicken jedoch sind die dort liegenden Dateien insgesamt 6GB groß.

    So wie das Projekt angelegt ist versucht es zu Synchronisieren/Downloaden wird nach einen Moment rsync wieder schließen und das Kopieren beginnen.
    Vorausgesetzt das es zu kopierende Dateien gibt...

    Jedoch bis jetzt schon einmal danke überhaupt für die Hilfe.
    Dateien

    Panics schrieb:

    in das Verzeichnis "ModBase" kopieren müssen
    Ja und weiter?
    Im oberen Label erscheint "Download Vorgang wurde beendet!", weiter passiert nix.
    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!
    Stimmt sehe gerade das dass gar nicht geht solange rsync sich mit nichts verbinden kann...
    Zur Not einfach den betroffenen bereich direkt ansprechen und den Code aus Button2 zu:

    VB.NET-Quellcode

    1. ​File_Copy(Directory.GetCurrentDirectory() & "\ModBase", "D:\Test")

    ändern.

    Oder du änderst diese Zeile:

    VB.NET-Quellcode

    1. ​.Arguments = " -htrvzn --del --progress --stats domain.tls::excore " & cygdrive & "/ModBase"

    Aus rsync_stuff2 zu:

    VB.NET-Quellcode

    1. .Arguments = " -htrvzn --del --progress --stats excore-gaming.eu::testload " & cygdrive & "/ModBase"

    Und diese Zeile aus rsync_stuff:

    VB.NET-Quellcode

    1. .Arguments = " -htrvz --del --progress --stats domain.tls::excore " & cygdrive & "/ModBase"

    zu:

    VB.NET-Quellcode

    1. .Arguments = " -htrvz --del --progress --stats excore-gaming.eu::testload " & cygdrive & "/ModBase"



    Ich habe diesen Server kurz eingerichtet und habe dort ca 150Mb Hochgeladen was aber exakt den Dateien des tatsächlichen Downloads entspricht.
    Jedoch Fehlen dort 90% der Dateien um die Größe nicht unnötig hoch zu tr

    Panics schrieb:

    Code aus Button2
    scheint zu funktionieren.
    ----------------
    nach den anderen Änderungen kommt dies:

    und das Programm ist eingefroren.
    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!

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

    Panics schrieb:

    Freigabe
    k.A.
    Dazu weiß ich nicht genug über Dein externes Zeugs und was da passieren soll.
    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!
    Also das dass Programm einfriert kann ich nicht nachvollziehen.
    Jedoch habe ich mittlerweile raus bekommen das rsync die Verzeichnisse mit einer Freigabe anlegt.
    Wenn ich die Fehlermeldungen unterdrücke funktioniert alles wie es soll, jedoch kann das ja nicht die Lösung sein...

    Der Fehler tritt auch nur auf wenn es sich um größere Dateien handelt.