Laden...

Datei kopieren mit Progressbar

Erstellt von Kovu vor 15 Jahren Letzter Beitrag vor 15 Jahren 10.934 Views
K
Kovu Themenstarter:in
488 Beiträge seit 2006
vor 15 Jahren
Datei kopieren mit Progressbar

Hi zusammen,

ich versuche Datei X (ca. 1 GB groß) zu kopieren.
Ich habe den File.Copy in einen Backgroundworker gepackt, wie kann ich nun die ProgressBar aktuallisieren nach dem prozentualem Fortschritt?
(also so wie Windows es auch darstellt)

Das Leben is :ugly:

Verdammt, mach das Fenster zu, wer hat den Gamma-Wert so hoch gestellt?

Gelöschter Account
vor 15 Jahren

mit file.copy->garnicht. da musst du schon manuell kopieren.

J
237 Beiträge seit 2008
vor 15 Jahren

Um den Fortschritt in einer ProgressBar darzustellen, musst du die Datei mit einem Reader/Writer kopieren. Dort kannst du dann z.B. alle 1024 Bytes den ProgressBar.Value um 1 erhöhen.

So in etwa: (Achtung: Frei aus dem Kopf)


byte[] data = new byte[1024];
while(reader.Read(data, 0, data.Length) != -1) {
    writer.Write(data);
    ++progressBar.Value;
}

//EDIT: JAck30lena war wohl schneller, trotzdem mal gepostet

Beim Programmieren löst man die Probleme, die man nicht hätte, programmierte man nicht.

3.511 Beiträge seit 2005
vor 15 Jahren

Wenn du genau die Anzeige haben willst, die Windows nutzt, kannst du die Methode SHFileOperation (shell32.dll) nutzen.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

M
194 Beiträge seit 2008
vor 15 Jahren

@Kovu:
Ein Beispiel hab ich mal auf meiner Website reingestellt: http://mrleeh.de/mrleeh/archives/238-Dateien-mit-Fortschrittsleiste-kopieren.html
Vielleicht nutzt dir das ja was. Grüße

"Indem Sie über dieses ernste Thema lachen disqualifizieren Sie sich selbst."
mrleeh.de

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo zusammen,

man sollte sich allerdings bewusst sein, dass File.Copy mehr macht, als den Inhalt der Datei zu kopieren. Oder noch allgemeiner ausgedrückt, kopieren ist mehr als kopieren des Inhalts. Eine Rolle spielen: Erstellungs- und Zugriffszeiten sowie Attribute der Datei, Dateiinfos (Titel, Betreff, Autor, ...), alternative Datenströme, sparse files (wäre tödlich, deren Inhalt als Bytefolge zu kopieren) und vermutlich gibt es noch mehr, was mir gerade nicht einfällt.

herbivore

K
Kovu Themenstarter:in
488 Beiträge seit 2006
vor 15 Jahren

@Kovu:
Ein Beispiel hab ich mal auf meiner Website reingestellt:
>

Vielleicht nutzt dir das ja was. Grüße

Hey das ist super, habe es eingebaut und es funktioniert einwandfrei.
Leider habe ich das übliche Problem, dass die Appl blockt während er kopiert, wäre es Möglich das noch zu verhindern?

Das Leben is :ugly:

Verdammt, mach das Fenster zu, wer hat den Gamma-Wert so hoch gestellt?

M
194 Beiträge seit 2008
vor 15 Jahren

Das blocken der Anwendung kannst du mit Application.DoEvents() verhindern. Das habe ich aber eigentlich schon mit eingebaut. Es gilt natürlich das, was Herbivore sagt, dass die Dateieigenschaften nicht mit übertragen werden. Die musst du dann evtl. noch nachträglich angleichen.

Beste Grüße

"Indem Sie über dieses ernste Thema lachen disqualifizieren Sie sich selbst."
mrleeh.de

M
194 Beiträge seit 2008
vor 15 Jahren

Kleine Ergänzung noch: Du musst unbedingt drauf achten, dass deine Teile, die du im Ganzen kopierst nicht zu groß werden. Dann wird nämlich dein RAM zugeRAMmelt und irgendwann geht nichts mehr. Das habe ich in dem Beispiel noch nicht eingebaut, werde es aber demnächst tun.

Weiß jemand eigentlich warum es so viel länger dauert, wenn man die Blockgröße kleiner wählt. Ich kann mir das nur so erklären, dass er dann öfter zwischen Lesen und Schreiben wechselt und somit ständig auf der Platte hin und her springt. Die Frage ist jetzt, was ist die optimale Blockgröße? Vielleicht ein Vielfaches der Clustergröße?

Grüße

"Indem Sie über dieses ernste Thema lachen disqualifizieren Sie sich selbst."
mrleeh.de

K
Kovu Themenstarter:in
488 Beiträge seit 2006
vor 15 Jahren

Hi,

ja aber er blockt trotzdem.
Meine Dateien die ich kopiere sind RAR-Datein die einen Schritt weiter automatisch von dem Programm entpackt und dann gelöscht wird. Sowas wie Attribute oder andere Sachen werden deswegen ja nicht gebraucht, sollte also jetzt kein Problem sein.

Da ich über 2 verschiedene Netzwerke kopiere und meine Dateien knapp 500 MB groß sind, ist die Schnittgröße bei mir 50 MB groß, dies zu kopieren dauert in der Regel bei mir zwischen 1 und 3 Minuten und währenddessen blockt das Programm.

Ich habe jetzt eine 100fache aufteilung gewählt, also 5 MB groß, es ist sogut wie perfekt, er blockt immer nur kurze Abstände die man einem User zumuten kann

Das Leben is :ugly:

Verdammt, mach das Fenster zu, wer hat den Gamma-Wert so hoch gestellt?

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Kovu,

gegen das Blockieren sollte man sowieso nicht DoEvents benutzen. Das ist (sorry MrLeeh) Friemelei. Wie du das Blockieren sicher und in jedem Fall beheben kannst, steht in [FAQ] Warum blockiert mein GUI?.

herbivore

5.299 Beiträge seit 2008
vor 15 Jahren

... und ein gepuffertes kopieren von Streams zeigt [ExtensionMethods] Verschiedene , nach "WriteTo" suchen

Der frühe Apfel fängt den Wurm.

F
101 Beiträge seit 2007
vor 15 Jahren

Vlt sollte man auch noch den freien Speicher überprüfen... gerade bei 1GB Datein macht das wenig spaß.

5.299 Beiträge seit 2008
vor 15 Jahren

Halte ich beim gepufferten Kopieren nicht für nötig. Mein Sample-Puffer ist mit Short.MaxValue ( = 32KB ) vlt. extrem klein, 1MB-Puffer ist heutzutage wohl bei jedem PC drin.
Man kann sich auch mal den BufferedStream angucken, ich vermute, der ist super-optimiert.

Der frühe Apfel fängt den Wurm.