mo0N Geschrieben 23. März 2009 Geschrieben 23. März 2009 In der folgenden Funktion kopiere ich eine Datei von einem, per USB verbundenen PDA, das dauert allerdings bei Dateien über 50 kb ewig lange. Jemand eine Idee, wie ich es ein wenig optimieren kann? private void CeCopyFile(CeFileInfo sourceFileInfo, String sDest) { int i; CeFileStream cStream; System.IO.FileStream fout; try { try { cStream = sourceFileInfo.Open(CeFileAccess.Read, CeFileMode.OpenExisting, CeShareMode.Read); } catch (System.IO.FileNotFoundException exc) { MessageBox.Show(exc.Message); return; } try { fout = new System.IO.FileStream(sDest, System.IO.FileMode.Create); } catch (System.IO.IOException exc) { MessageBox.Show(exc.Message); return; } } catch (IndexOutOfRangeException exc) { MessageBox.Show(exc.Message); return; } try { do { i = cStream.ReadByte(); if (i != -1) fout.WriteByte((byte)i); } while (i != -1); } catch (System.IO.IOException exc) { MessageBox.Show(exc.Message); } cStream.Close(); fout.Close(); } }[/PHP] Zitieren
Guybrush Threepwood Geschrieben 23. März 2009 Geschrieben 23. März 2009 Indem du die nicht Byte weise liest und schreibst sondern komplett kopierst? Zitieren
VaNaTiC Geschrieben 23. März 2009 Geschrieben 23. März 2009 Indem du die nicht Byte weise liest und schreibst sondern komplett kopierst? Agree. Dafür nimmst Du nicht ReadByte(), sondern Read(Byte[] puffer, int laenge). Zitieren
mo0N Geschrieben 23. März 2009 Autor Geschrieben 23. März 2009 Like this...?! private void CeCopyFile(CeFileInfo sourceFileInfo, String sDest) { CeFileStream cStream; System.IO.FileStream fout; try { try { cStream = sourceFileInfo.Open(CeFileAccess.Read, CeFileMode.OpenExisting, CeShareMode.Read); } catch (System.IO.FileNotFoundException exc) { MessageBox.Show(exc.Message); return; } try { fout = new System.IO.FileStream(sDest, System.IO.FileMode.Create); } catch (System.IO.IOException exc) { MessageBox.Show(exc.Message); return; } } catch (IndexOutOfRangeException exc) { MessageBox.Show(exc.Message); return; } try { byte[] buffer = new byte[cStream.Length]; int length = (int)cStream.Length; int sum=0; int count; while ((count = cStream.Read(buffer, sum, length - sum)) > 0) sum += count; fout.Write(buffer, 0, (int)cStream.Length); } catch (System.IO.IOException exc) { MessageBox.Show(exc.Message); } cStream.Close(); fout.Close(); } }[/PHP] Zitieren
VaNaTiC Geschrieben 23. März 2009 Geschrieben 23. März 2009 Jein. Ich würde mit einem festen Puffer arbeiten. Nicht das mal auf dem portablen Gerät eine Datei >50MB ist Also im try-Body: byte[] buffer = new byte[1024]; int count; while ((count = cStream.Read(buffer, 0, buffer.Length)) > 0) fout.Write(buffer, 0, count); Zitieren
mo0N Geschrieben 23. März 2009 Autor Geschrieben 23. März 2009 Jein. Ich würde mit einem festen Puffer arbeiten. Nicht das mal auf dem portablen Gerät eine Datei >50MB ist Das halte ich für keine gute Idee, dabei geht es um eine Inventurdatenverwaltung, und falls da wirklich mal der Fall eintreten sollte, das eine Datei über 50 MB sein sollte, darf sie auf gar keinen Fall übergangen werden, stell dir das Chaos vor, wenn da irgendwas fehlt Zitieren
VaNaTiC Geschrieben 23. März 2009 Geschrieben 23. März 2009 Hmm, ich verstehe den Zusammenhang nicht. Wo werden denn Dateien übergangen oder fehlen? Der Puffer von 1 kB hat nix damit zu tun. Dein Beispiel was zu langsam war, hatte einen "Puffer" von einem Byte. Jetzt halt von 1024. Die Größe des Puffers kann sehr wohl auf die jeweilige Situation optimiert werden. Aber an dem Verfahren ändert, dass Du liest nacheinander jeweils 1024 byte aus Deiner CE-Datei liest und diese Bytes in die Zieldatei schreibst, ändert das nichts. Ob Du nun alle Daten auf einmal in den Puffer liest und auf einmal in die Zieldatei schreibst oder Häppchenweise ist völlig egal. Sobald ein Fehler passiert, kommt eh die Exception. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.