# VB Datein und Ordner kopieren (FSO) mit Fortschrittsanzeige



## bernimoses (9. September 2008)

Hi,

ich hab ein großes Problem, und das nennt sich FileSystemObjekt. Wie es funktioniert und wie man Dateien kopieren verschieben, ... machen kann weiß ich bloß ist das nicht so schön wenn der Ordner größer als 10MB ist. Mann weiß nie wann es fertig ist. Deshalb meine Frage kann man da irgendwie einen Fortschrittsbalken reinbauen?

Hier noch den Code den ich gerade benutze:bas

basFunctions:

```
Public fso As FileSystemObject

Public Function MoveFile(file1 As String, file2 As String)
    Set fso = New FileSystemObject
    fso.MoveFile file1, file2
    Set fso = Nothing
End Function

Public Function MoveFolder(folder1 As String, folder2 As String)
    Set fso = New FileSystemObject
    fso.MoveFolder folder1, folder2
    Set fso = Nothing
End Function
```

frmMain:

```
Private sub Command1_Click()
    MoveFile "test.txt", "C:\test.txt"
End Sub

Private sub Command2_Click()
    MoveFolder "test", "C:\test"
End Sub
```

Man könnte das ganze natürlich noch ein wenig komplizierter machen aber so isses doch glaub ich am leichtesten.  Ich hoffe das ihr weiter wisst.  Wenn es aber mit dem FSO nicht geht dann währe ich auch für andere Vorschläge offen.


----------



## Zvoni (10. September 2008)

Tip: Stopfe das FSO dorthin, wo es hingehört, in den Müll!

Schau dir lieber mal die API "SHFileOperation" an
http://www.oscl.de/Library/Visual Basic 6.0/Windows-API/Funktionen/S/SHFileOperation.html


----------



## bernimoses (10. September 2008)

das hab ich auch schon gefunden nur konnte ich mich damit nicht anfreunden, weil das den windows dialog benutzt. Ich brauch eine Lösung mit der ich selbst eine Progressbar ansteuern kann, die ich auf einer form platziere. Bitte helft mir.


----------



## Zvoni (11. September 2008)

Da wirst du nicht viel Glück haben, da alle File-OP's eigentlich von Windows durchgeführt werden. Die ganzen Funktionen von VB, welche mit Dateien zu haben (wie eigentlich im Prinzip alle Funktionen von VB), rufen im Background nur die entsprechenden Windows-API's auf.

Um auch nur annäherend in die Ecke zu kommen, welche du anstrebst, müsstest du eventuell wie folgt vorgehen:

Erstelle eine Form, welches deine Fortschrittsanzeige sein soll.
Platziere alle Controls, die du brauchst auf dieser Form (Progress-Bar, Label usw.)
Stelle die Grösse der Quell-Datei in Bytes fest.
Setze diese Grösse als Max-Wert der Progress-Bar.
Öffne die Quell-Datei im Binary-Mode.
Öffne gleichzeitig im Zielverzeichnis deine Zieldatei im Binary-Mode (wird dadurch auch automatisch erstellt, wenn sie nicht existiert --> Fehlerbehandlung einbauen "Datei existiert!")
Lese jetzt in einer Schleife die Quelldatei Byte für Byte ein, und schreibe sie Byte für Byte in die Zieldatei, wobei du die Zählervariable gleichzeitig als Value für die Progress-Bar verwendest.
Wenn die Schleife fertig ist, noch alle erforderlichen Aufräumarbeiten durchführen.
Fertig.


----------



## bernimoses (11. September 2008)

Also bei den Punkten
Stelle die Grösse der Quell-Datei in Bytes fest.
Öffne die Quell-Datei im Binary-Mode.
Öffne gleichzeitig im Zielverzeichnis deine Zieldatei im Binary-Mode (wird dadurch auch automatisch erstellt, wenn sie nicht existiert --> Fehlerbehandlung einbauen "Datei existiert!")
Lese jetzt in einer Schleife die Quelldatei Byte für Byte ein, und schreibe sie Byte für Byte in die Zieldatei, wobei du die Zählervariable gleichzeitig als Value für die Progress-Bar verwendest.
Wenn die Schleife fertig ist, noch alle erforderlichen Aufräumarbeiten durchführen.
blick ich nicht ganz durch. könntest du mir vll mit einem 
Beispielcode auf die Sprünge helfen? Danke


----------



## Zvoni (11. September 2008)

Dateigrösse --> http://www.vbarchiv.net/commands/FileLen.php
Datei lesen/schreiben --> http://www.vbarchiv.net/tipps/details.php?id=301

```
DateiGrösse=FileLen(QuellDatei)
ProgressBar.Min=0
ProgressBar.Max=DateiGrösse

'Hier Code für QuellDatei Öffnen
'Hier Code für ZielDatei öffnen

For i=0 to Dateigrösse

'Hier Code für Lese Byte aus QuellDatei
'Hier Code für Schreibe Byte in ZielDatei

ProgressBar.Value=i

Next

'Aufräumarbeiten --> Dateien schliessen, Fenster entladen usw.
```


----------



## ronaldh (11. September 2008)

Die von Zvoni aufgeführte Möglichkeit ist vollkommen richtig, wenn es UNBEDINGT erforderlich ist, eine eigene Progressbar anzuzeigen. Allerdings musst Du Dir darüber im Klaren sein, dass diese eigene Kopiermöglichkeit im binären Modus naturgemäß wesentlich langsamer ist, als die Nutzung der ebenfalls von Zvoni völlig zu Recht angeführten API-Funktion. 

Bei der API-Funktion macht Windows letztlich alles allein, wenn Du den binären Weg gehst, ist ein zusätzlicher Umweg über Dein Programm erforderlich. 

Falls es also um größere Dateien geht (und nur bei solchen ist eine Progressbar überhaupt sinnvoll), würde ich daher grundsätzlich die API-Variante wählen.


----------



## Zvoni (11. September 2008)

Exakt, ron!

Und ich will jetzt mal gar nicht den Spass erwähnen, der involviert ist, wenn man ganze Ordner kopieren will. Und wenn diese Ordner auch noch Unterordner haben wird es ja erst richtig witzig (Stichwort "Rekursion").


----------



## bernimoses (11. September 2008)

Danke. Hab es mal ausprobiert nur wie ihr gesagt habt ein wenig langsam. also habe ich mich noch mit FSO beschäftigt und wie du sicher gemerkt hasst auch mit dateiauflistung gearbeitet. Dabei habe ich eine Lösung gefunden, da es in meinem Fall langt wenn ich die Progressbar nur nach Dateianzahl laufen lasse.


----------

