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]
Guybrush Threepwood Geschrieben 23. März 2009 Geschrieben 23. März 2009 Indem du die nicht Byte weise liest und schreibst sondern komplett kopierst?
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).
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]
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);
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
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.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden