Filecopy mit Progressbar - Fehler bei Bildern (jpg) -> erzeugt fehlerhafte Daten

symax

Mitglied
Hallo,

ich versuche gerade einen allgemein gültigen algorithmus zu schreiben, der beliebige Dateien (.txt, .exe, jpg, .png, was halt da ist) kopieren soll.

In meinem Testordner sind derzeit Bilder .jpg und .txt dateien. Die Textdateien kopieren funktioniert.
Nur wenn ich jetzt die .jpg Bilder kopiere, dann sind die Dateien nachher korrupt (< 4kb).

Wie kann ich meinen Code so ändern, dass das nicht passiert ? (Encoding vlt irgendwie ? Finde da aber nur was mit streamreader und nicht mit filestream)
Weiterhin sagt er mir, wenn ich versuche diese Bilder zu öffnen, diese seien noch in Benutzung. Beende ich das debuging, dann kann ich darauf zugreifen (dann kommt Anzeige = Bild fehlerhaft); obwohl ich die filestream schließe ? Wo ist da mein (Denk-) Fehhler ?

Informationen bezügl. Variablen / System:
Windows 7 X64
Visual Basic 2010 Express
progressbar1 ist die Progressbar
die Dateien hab ich alle in einem array, die ich dann in einer for-Schleife durch den unten stehenden algorithmus jage.

Code:
Public Sub copyfilewithprogress(ByVal origin As String, ByVal destin As String)
        Dim fi As New IO.FileInfo(origin)
        Dim sr As New IO.FileStream(origin, IO.FileMode.Open)
        Dim sw As New IO.FileStream(destin, IO.FileMode.Create)
        Dim len As Long = sr.Length - 1
        For i As Long = 0 To len
            sw.WriteByte(sr.ReadByte)
            If i Mod 1000 = 0 Then
                ProgressBar1.Value = i * 100 / len
                Application.DoEvents()
                Progressbar1.refresh()
            End If
        Next
        ProgressBar1.Value = 0
        sr.Close()
        sw.Close()
    End Sub

Danke für eure Hilfe :D
 

Zvoni

Erfahrenes Mitglied
Mal ne dumme Frage: Wieso benutzt du nicht einfach die CopyFileEx-API-Funktion von Windows?
 

symax

Mitglied
Danke für den Tipp mit dem BinaryReader/Writer Shakie :D

Hier der Quellcode:
Code:
        Dim stream1 As FileStream = New FileStream(quelle, FileMode.Open)
        Dim stream2 As FileStream = New FileStream(ziel, FileMode.Create)
        Dim sReader As BinaryReader = New BinaryReader(stream1)
        Dim sWriter As BinaryWriter = New IO.BinaryWriter(stream2)
        ProgressBar1.Maximum = (FileLen(quelle) - 1)
        For i = 0 To (FileLen(quelle) - 1)
            sWriter.Write(sReader.ReadByte)
            If i Mod 5000 = 0 Then
                ProgressBar1.Value = i
                ProgressBar1.Refresh()
            End If
        Next

@ Zvoni: Mir der API kann ich keine Progressbar für den Kopierprozess anzeigen
 

symax

Mitglied
ahh ok ?
Das wusste ich bisher leider nicht. Ich dachte das ging nicht (Quellen: Irgendwo Internet ...)

Ich hab 2 Progressbars
1 für aktuellen Kopierstatus (Datei)
1 für gesamtstatus

und ich habe die für den Kopierstatus_DATEI bisher nicht mit der API verbinden können.
Hast du da mal n Codeschnipsel für mich ? (Gesamtstatus ist ja hier nicht das Problem ^^)

LG Symax