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
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:
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:
VB.NET-Quellcode
- Imports System
- Imports System.ComponentModel
- Imports System.IO
- Imports System.Runtime.InteropServices
- Public Class Form1
- Private Const WM_DEVICECHANGE As Integer = &H219
- Private Const DBT_DEVICEARRIVAL As Integer = &H8000
- Private Const DBT_DEVTYP_VOLUME As Integer = &H2
- Dim Laufwerk As String = ""
- Dim Settings As New My.MySettings
- Dim Fortschritt As Integer
- Dim Argument As String
- 'Device information structure
- Public Structure DEV_BROADCAST_HDR
- Public dbch_size As Int32
- Public dbch_devicetype As Int32
- Public dbch_reserved As Int32
- End Structure
- 'Volume information Structure
- Private Structure DEV_BROADCAST_VOLUME
- Public dbcv_size As Int32
- Public dbcv_devicetype As Int32
- Public dbcv_reserved As Int32
- Public dbcv_unitmask As Int32
- Public dbcv_flags As Int16
- End Structure
- 'Function that gets the drive letter from the unit mask
- Private Function GetDriveLetterFromMask(ByRef Unit As Int32) As Char
- For i As Integer = 0 To 25
- If Unit = (2 ^ i) Then
- Return Chr(Asc("A") + i)
- End If
- Next
- End Function
- 'Override message processing to check for the DEVICECHANGE message
- Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
- If m.Msg = WM_DEVICECHANGE Then
- If CInt(m.WParam) = DBT_DEVICEARRIVAL Then
- Dim DeviceInfo As DEV_BROADCAST_HDR
- DeviceInfo = DirectCast(Marshal.PtrToStructure(m.LParam, GetType(DEV_BROADCAST_HDR)), DEV_BROADCAST_HDR)
- If DeviceInfo.dbch_devicetype = DBT_DEVTYP_VOLUME Then
- Dim Volume As DEV_BROADCAST_VOLUME
- Volume = DirectCast(Marshal.PtrToStructure(m.LParam, GetType(DEV_BROADCAST_VOLUME)), DEV_BROADCAST_VOLUME)
- Dim DriveLetter As String = (GetDriveLetterFromMask(Volume.dbcv_unitmask) & ":\")
- If IO.File.Exists(IO.Path.Combine(DriveLetter, "test.txt")) Then
- '<<<< The test file has been found >>>>
- ' MessageBox.Show("Kopiere...")
- LabelPfad.Text = DriveLetter & "KNX"
- Laufwerk = DriveLetter & "KNX"
- Argument = "/REMOVELETTER" & " " & DriveLetter
- Label3.Text = Argument
- bgWorker.RunWorkerAsync()
- Else
- '<<<< Test file has not been found >>>>
- End If
- End If
- End If
- End If
- 'Process all other messages as normal
- MyBase.WndProc(m)
- End Sub
- 'BackgroundWorker to copy files
- Private Sub bgWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker.DoWork
- Try
- Dim source As New FileStream(Laufwerk, FileMode.Open, FileAccess.Read)
- Dim dest As New FileStream(Sicherungspfad.Text, FileMode.OpenOrCreate, FileAccess.Write)
- Dim percent As Integer = 0
- Dim buffer(1024) As Byte
- Dim bytesRead As Integer
- Dim allBytesWrote As Long = 0
- Dim numBytes As Long = source.Length
- Do
- bytesRead = source.Read(buffer, 0, buffer.Length)
- dest.Write(buffer, 0, bytesRead)
- allBytesWrote = allBytesWrote + bytesRead
- Dim oldPercent = percent
- percent = (allBytesWrote * 100) / numBytes
- If Not oldPercent = percent Then
- bgWorker.ReportProgress(percent)
- End If
- Loop While Not bytesRead = 0
- source.Close()
- dest.Close()
- Catch ex As Exception
- MsgBox(ex.ToString)
- End Try
- End Sub
- 'Refresh ProgressBar
- Private Sub bgWorker_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgWorker.ProgressChanged
- Fortschritt = e.ProgressPercentage
- pBar.Value = e.ProgressPercentage
- LFortschritt.Text = e.ProgressPercentage & "%"
- End Sub
- 'Reset ProgressBar
- Private Sub bgWorker_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgWorker.RunWorkerCompleted
- pBar.Value = 0
- 'USB auswerfen
- Process.Start(My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData & "\eject.exe", Argument)
- End Sub
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- Sicherungspfad.Text = Settings.Sicherungspfad
- My.Computer.FileSystem.WriteAllBytes(My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData & "\eject.exe", My.Resources.eject, False)
- End Sub
- Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
- If MessageBox.Show("Wenn das Programm beendet wird," & vbNewLine & "werden alle Vorgänge abgebrochen." & vbNewLine & vbNewLine &
- "Die Datensicherung wird bis zum" & vbNewLine & "nächsten Start nicht verfügbar sein." & vbNewLine & vbNewLine &
- "Beenden?", "Warnung!", MessageBoxButtons.YesNo) = MsgBoxResult.Yes Then
- e.Cancel = False
- Else
- e.Cancel = True
- End If
- End Sub
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- Process.Start(My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData & "\eject.exe", Argument)
- End Sub
- Private Sub Sicherungspfad_TextChanged(sender As Object, e As EventArgs) Handles Sicherungspfad.Click
- FolderBrowserDialog1.ShowDialog()
- If FolderBrowserDialog1.SelectedPath = "" Then
- FolderBrowserDialog1.SelectedPath = Settings.Sicherungspfad
- Sicherungspfad.Text = FolderBrowserDialog1.SelectedPath
- Else
- Settings.Sicherungspfad = FolderBrowserDialog1.SelectedPath
- Sicherungspfad.Text = FolderBrowserDialog1.SelectedPath
- End If
- Settings.Save()
- Settings.Reload()
- End Sub
- End Class
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Waldobert“ ()