Zugriff auf Pfad wurde verweigert(USB Stick)

  • VB.NET

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

    Zugriff auf Pfad wurde verweigert(USB Stick)

    Servus, ich will folgendes bewerkstelligen:

    Wenn ein USB-Stick angeschlossen wird, soll geprüft werden, ob eine spezielle Datei vorhanden ist. Ist diese vorhanden, soll der Ordner "KNX" vom USB-Stick nach zB "C:\Backups" kopiert werden. Danach soll der Stick sicher ausgeworfen werden. Der akt. Fortschritt wird über eine ProgressBar und über einen COM-Port ausgegeben.

    Erkennung des Sticks und des Laufwerksbuchstaben funktioniert einwandfrei, COM-Meldungen werden noch hinzugefügt...
    (Label3 und Button1 sind nur für mich, um zu sehen, ob das auswerfen funktioniert)
    Allerdings bekomme ich folgende Fehlermeldung, wenn ich kopieren will:


    Spoiler anzeigen

    System.UnauthorizedAccessException: Der Zugriff auf den Pfad "H:\KNX" wurde verweigert.

    bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)

    bei System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)

    bei System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)

    bei Datenabgleich_USB.Form1.bgWorker_DoWork(Object sender, DoWorkEventArgs e) in D:\users\waldobert\documents\visual studio 2017\Projects\Datenabgleich_USB\Datenabgleich_USB\Form1.vb:Zeile 74.


    Programm wird als Admin gestartet. Filesystem auf dem Stick kann NTFS oder FAT32 sein, je nachdem welchen Stick man anschließt. Hat jemand ne Idee, wie ich das ganze zum Laufen bekomme? Danke.

    und hier der Quelltext:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.ComponentModel
    3. Imports System.IO
    4. Imports System.Runtime.InteropServices
    5. Public Class Form1
    6. Private Const WM_DEVICECHANGE As Integer = &H219
    7. Private Const DBT_DEVICEARRIVAL As Integer = &H8000
    8. Private Const DBT_DEVTYP_VOLUME As Integer = &H2
    9. Dim Laufwerk As String = ""
    10. Dim Settings As New My.MySettings
    11. Dim Fortschritt As Integer
    12. Dim Argument As String
    13. 'Device information structure
    14. Public Structure DEV_BROADCAST_HDR
    15. Public dbch_size As Int32
    16. Public dbch_devicetype As Int32
    17. Public dbch_reserved As Int32
    18. End Structure
    19. 'Volume information Structure
    20. Private Structure DEV_BROADCAST_VOLUME
    21. Public dbcv_size As Int32
    22. Public dbcv_devicetype As Int32
    23. Public dbcv_reserved As Int32
    24. Public dbcv_unitmask As Int32
    25. Public dbcv_flags As Int16
    26. End Structure
    27. 'Function that gets the drive letter from the unit mask
    28. Private Function GetDriveLetterFromMask(ByRef Unit As Int32) As Char
    29. For i As Integer = 0 To 25
    30. If Unit = (2 ^ i) Then
    31. Return Chr(Asc("A") + i)
    32. End If
    33. Next
    34. End Function
    35. 'Override message processing to check for the DEVICECHANGE message
    36. Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    37. If m.Msg = WM_DEVICECHANGE Then
    38. If CInt(m.WParam) = DBT_DEVICEARRIVAL Then
    39. Dim DeviceInfo As DEV_BROADCAST_HDR
    40. DeviceInfo = DirectCast(Marshal.PtrToStructure(m.LParam, GetType(DEV_BROADCAST_HDR)), DEV_BROADCAST_HDR)
    41. If DeviceInfo.dbch_devicetype = DBT_DEVTYP_VOLUME Then
    42. Dim Volume As DEV_BROADCAST_VOLUME
    43. Volume = DirectCast(Marshal.PtrToStructure(m.LParam, GetType(DEV_BROADCAST_VOLUME)), DEV_BROADCAST_VOLUME)
    44. Dim DriveLetter As String = (GetDriveLetterFromMask(Volume.dbcv_unitmask) & ":\")
    45. If IO.File.Exists(IO.Path.Combine(DriveLetter, "test.txt")) Then
    46. '<<<< The test file has been found >>>>
    47. ' MessageBox.Show("Kopiere...")
    48. LabelPfad.Text = DriveLetter & "KNX"
    49. Laufwerk = DriveLetter & "KNX"
    50. Argument = "/REMOVELETTER" & " " & DriveLetter
    51. Label3.Text = Argument
    52. bgWorker.RunWorkerAsync()
    53. Else
    54. '<<<< Test file has not been found >>>>
    55. End If
    56. End If
    57. End If
    58. End If
    59. 'Process all other messages as normal
    60. MyBase.WndProc(m)
    61. End Sub
    62. 'BackgroundWorker to copy files
    63. Private Sub bgWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker.DoWork
    64. Try
    65. Dim source As New FileStream(Laufwerk, FileMode.Open, FileAccess.Read)
    66. Dim dest As New FileStream(Sicherungspfad.Text, FileMode.OpenOrCreate, FileAccess.Write)
    67. Dim percent As Integer = 0
    68. Dim buffer(1024) As Byte
    69. Dim bytesRead As Integer
    70. Dim allBytesWrote As Long = 0
    71. Dim numBytes As Long = source.Length
    72. Do
    73. bytesRead = source.Read(buffer, 0, buffer.Length)
    74. dest.Write(buffer, 0, bytesRead)
    75. allBytesWrote = allBytesWrote + bytesRead
    76. Dim oldPercent = percent
    77. percent = (allBytesWrote * 100) / numBytes
    78. If Not oldPercent = percent Then
    79. bgWorker.ReportProgress(percent)
    80. End If
    81. Loop While Not bytesRead = 0
    82. source.Close()
    83. dest.Close()
    84. Catch ex As Exception
    85. MsgBox(ex.ToString)
    86. End Try
    87. End Sub
    88. 'Refresh ProgressBar
    89. Private Sub bgWorker_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgWorker.ProgressChanged
    90. Fortschritt = e.ProgressPercentage
    91. pBar.Value = e.ProgressPercentage
    92. LFortschritt.Text = e.ProgressPercentage & "%"
    93. End Sub
    94. 'Reset ProgressBar
    95. Private Sub bgWorker_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgWorker.RunWorkerCompleted
    96. pBar.Value = 0
    97. 'USB auswerfen
    98. Process.Start(My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData & "\eject.exe", Argument)
    99. End Sub
    100. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    101. Sicherungspfad.Text = Settings.Sicherungspfad
    102. My.Computer.FileSystem.WriteAllBytes(My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData & "\eject.exe", My.Resources.eject, False)
    103. End Sub
    104. Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
    105. If MessageBox.Show("Wenn das Programm beendet wird," & vbNewLine & "werden alle Vorgänge abgebrochen." & vbNewLine & vbNewLine &
    106. "Die Datensicherung wird bis zum" & vbNewLine & "nächsten Start nicht verfügbar sein." & vbNewLine & vbNewLine &
    107. "Beenden?", "Warnung!", MessageBoxButtons.YesNo) = MsgBoxResult.Yes Then
    108. e.Cancel = False
    109. Else
    110. e.Cancel = True
    111. End If
    112. End Sub
    113. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    114. Process.Start(My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData & "\eject.exe", Argument)
    115. End Sub
    116. Private Sub Sicherungspfad_TextChanged(sender As Object, e As EventArgs) Handles Sicherungspfad.Click
    117. FolderBrowserDialog1.ShowDialog()
    118. If FolderBrowserDialog1.SelectedPath = "" Then
    119. FolderBrowserDialog1.SelectedPath = Settings.Sicherungspfad
    120. Sicherungspfad.Text = FolderBrowserDialog1.SelectedPath
    121. Else
    122. Settings.Sicherungspfad = FolderBrowserDialog1.SelectedPath
    123. Sicherungspfad.Text = FolderBrowserDialog1.SelectedPath
    124. End If
    125. Settings.Save()
    126. Settings.Reload()
    127. End Sub
    128. End Class

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Waldobert“ ()

    @Waldobert Willkommen im Forum. :thumbup:
    Der BackgroundWorker ist hier etwas suboptimal, das Ding ist ein Dinosaurier unter den Components.
    Vielleicht rufst Du den Code zunächst aus dem Main-Thread heraus auf, da lassen sich die Fehler besser untersuchen.
    Welches genau ist die Fehlerzeile?
    Kannst Du die Datei aus dem Explorer heraus kopieren?
    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!
    Könnte es damit zusammenhänge, das du dem FileStream den Ordnerpfad und keinen Dateipfad als Pfad angibst? Ich bin mir nicht sicher, aber würde mal vermuten das der einen Pfad zu einer Datei erwartet.
    @slice Genau.
    @Waldobert Gib mal den Inhalt der Variable Laufwerk in einer MessageBox aus und überzeuge Dich davon, dass deren Inhalt korrekt ist.
    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!

    slice schrieb:

    Ein Breakpoint setzten
    Das ist sein erster Post, ich wollte ihn nicht mit Debuggen, Fehler finden und beseitigen verwirren.
    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!