BigBastis Blog

VB.NET: Dateioperationen mit Fortschrittsanzeige Teil 1 – Kopieren & Verschieben

Introduction

user

Sebastian Gross

Sebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.


LATEST POSTS

Handling too long scrollspy menus 10th June, 2015

Java: Create ZIP archive 23rd March, 2015

.NET

VB.NET: Dateioperationen mit Fortschrittsanzeige Teil 1 – Kopieren & Verschieben

Posted on .

Wenn man grafische Oberflächen entwickelt wird man irgendwann an dem Punkt kommen wo man Dateien kopieren, verschieben oder herunterladen will. Wenn diese nicht grade wenig und klein sind bietet es sich natürlich an eine Fortschrittanzeige dafür zu erstellen. Damit wird sich diese Serie beschäftigen.

Teil 1 – Kopieren und verschieben von Dateien – Update am 22.10.09

iofileWenn man unter .NET Dateioperationen wie kopieren, löschen, verschieben oder umbenennen durchführen will, so kann man das mit Hilfe hauseigener Klassen erledigen. Die meisten Dateioperationen findet man in der Klasse File im System.IO Namespace. (siehe Bild)

.NET bietet aber auch Funktionen zum hoch- und herunterladen von Dateien aus dem Internet, ohne dass man eine eigene Funktion schreiben muss!

Doch sobald man den Status des Kopier- oder Downloadvorgangs erfragen will um diesen zB. in einer StatusBar darzustellen ist man etwas alleingelassen und muss dies selbst in die Hand nehmen.

So muss man das was normalerweise das System für uns übernimmt selber machen. Also einen Strom erstellen um die Daten einzulesen, einen Puffer, und einen Strom um die gepufferten Daten wieder an einen anderen Ort zu schreiben.

Wenn ich hier von Strom rede meine ich den IO.FileStream der die für uns wichtigen Funktionen Read & Write bereitstellt, welche beide byteorientiert sind!

Es gibt natürlich verschiedene Ansätze wie man dieses Vorhaben umsetzen kann. So könnte man zB. Einen Thread erstellen, der nichts anderes macht als den IO.File.Copy Befehlt ausführt und das System die Datei kopieren lässt.

Da wir wissen wie Groß die Datei ist und wohin wir diese kopieren können wir auch gleich (zB. mit einem Timer) prüfen wie lange diese Operation dauert, wie viel übertragen wurde in dem wir ständig die temporäre Datei messen die vom System am Zielort erstellt wird und auch die Kopiergeschwindigkeit aus der Differenz.

Das ist aber nicht so schön und sieht vom Code aus nicht so schön aus! Weswegen ich hier in der Demo einen anderen Ansatz wähle, nämlich den, den ich am Anfang beschrieben habe!

Dieser hat den Vorteil, dass unser Programm ständig in Kontrolle des Kopiervorgangs bleibt und diesen eventuell unterbrechen kann. Oder zu einem Späteren Zeitpunkt fortsetzen. (Das system macht das nicht)

Desweiteren kann man dieses System auch viel einfacher erweitern um den Strom zB. zu verschlüsseln.

Das Vorgehen ist hierbei relativ simpel, da man eine Datei Stück für Stück ausließt und dann an einer anderer Stelle wieder zusammen Setzt. Alsob man ein Haus aus Lego an einen anderen Ort bringen müsste. (Stein für Stein)

Dabei kann die Anzahl der Steine (der Puffer) variieren denn umso mehr wir gleichzeitig tragen desto schneller geht es. Was auch noch ein Vorteil ist – wir können die Geschwindigkeit der Übertragung beeinflussen!

Um das System zu demonstrieren habe ich eine Klasse angefertigt, die ihr auch in euren  Projekten benutzen könnt.  Die Benutzung ist sehr einfach gehalten:

copyfilessrcBild 2: Die initialisierung und Ausführung des Kopiervorgangs

Es kann eine Progressbar und ein Label übergeben werden, mit denen dann der Kopiervorgang visualisiert wird.

Der Ganze Kopiervorgang läuft in einem eigenen Thread der mit der Anweisung FileCopy.copyFiles() gestartet wird.screencopy

Bild 3: Der Kopielvorgang läuft…

Natürlich ist hier und da noch was verbesserungswürdig, wichtig ist nur, dass das Prinzip deutlich wird, wie hier vorgegangen wird.

UPDATE: Ich habe das Demoprojekt noch etwas überarbeitet, da die alte Version nicht sehr Perfomat war und unmengen an Speicher gefressen hat. Nun sollte das besser sein!
Für Verbesserungsvorschläge bin ich natürlich weiterhin offen!

Hier könnt ihr euch die Demo herunterladen: Download

Serienteile:

Teil 1 – Kopieren und Verschieben von Dateien
Teil 2 – Download von Dateien

Teil 3 – Wiederaufnahme von Downloads nach einem Abbruch
Teil 4 – Upload von Dateien

profile

Sebastian Gross

http://www.bigbasti.com

Sebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.

Comments
user

Author Sio_x

Posted at 15:44 4. September 2013.

Ja es geht besser. Die While Schleife gefällt mir nicht…
kannst ja machen

NumBytesToRead as Long = fis.length
While NumBytestoRead > 0
readbytes = ….

NumBytesToRead -= readbytes
End While

Kommentar verfassen

View Comments (1) ...
Navigation