Zum Inhalt springen

[c#] FileStream - Copy viel zu langsam


Empfohlene Beiträge

Geschrieben

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]

Geschrieben

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]

Geschrieben

Jein. Ich würde mit einem festen Puffer arbeiten. Nicht das mal auf dem portablen Gerät eine Datei >50MB ist :D

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);

Geschrieben
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 ;)

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...