FileStream.Read() & Write() - Dateiinhalt geändert

Christian Kusmanow

Erfahrenes Mitglied
Hallo FIAE's!

Ich hab diesmal ein richtig kompliziertes Problem.

Ich möchte eine WMV-Datei in den speicher laden und via SOAP zu Server schicken. Das kuriose dabei ist das schon mal ohne Probleme geklappt hat, und jetzt nicht mehr. Wenn die Datei angekommen ist, ist sie nicht mehr lesbar.
Ich hatte die notwendigen Methoden vor kurzer Zeit schon fertig implementiert.

Einlesen der Datei:
Code:
fin = new FileStream( Dir + FileName, FileMode.Open, FileAccess.Read );

// Hilfs-Variablen Initialisierung
byte[] rdBuffer = new byte[ 4096 ];
WmvFileBuffer = new byte[ fin.Length ];
long rdlen = 0;             
long totlen = fin.Length;   
int len;                     

	// 4096 Bit-weise auslesen, entschlüsseln und in den "WmvFileBuffer" kopieren.
	while( rdlen < totlen ) {
		len = fin.Read( rdBuffer, 0, 4096 );
					
		if ( len == 4096 )
			rdBuffer.CopyTo(WmvFileBuffer,rdlen);
		else
			rdBuffer.CopyTo(WmvFileBuffer,rdlen - ( 4096 - len ));
		rdlen = rdlen + len;
	}
	fin.Close();

Zum testen hab ich die eingelesenen Bit's wieder in einen anderen FileStream geschrieben und Datei unter einen anderen Namen gespeichert.
Danach war die Datei auch unbrauchbar.

So hab ich den Buffer wieder auf die Platte geschrieben:
Code:
fout = new FileStream( Dir+"test.wmv", FileMode.Create, FileAccess.Write );
	while( rdlen < totlen ) {

		if ( rdlen < WmvFileBuffer.Length - 4096 )
			fout.Write( WmvFileBuffer, 0, 4096 );
		else
			fout.Write( WmvFileBuffer, 0, WmvFileBuffer.Length - rdlen );
		rdlen = rdlen + 4096;
	}

fout.Close();

Kann mir jemand verraten was hier schief gegangen ist?
Ich bin mir ganz sicher das kein Bit ausgelassen wurde.
 
:rolleyes: Danke für die konstruktiven vorschläge! :rolleyes:

Lesen:
Code:
while(rdlen < totlen) {
	// Soviel lesen wie der StreamBuffer hergibt
	len = fin.Read( rdBuffer, 0, 4096 );
	
	if ( len == 4096 )	// Wenn der LeseBuffer voll ist
		rdBuffer.CopyTo( WmvFileBuffer,rdlen );

	else	// Es wurden weniger als die Max Buffergöße gelesen
		// demzufolge werden alle restlichen gelesen
 		for ( uint i = 0; i < len ; i++ )
			WmvFileBuffer[ rdlen + i ] = rdBuffer[ i ];
	rdlen += len;
}
Schreiben:
Code:
while(rdlen < totlen) {
	// wenn man zu den gelesenen Bytes die Bufferlänge hinzuzählt darf
	// die gesammtLänge nicht überschritten werden,
	// weil man sonst in's Nichts schreiben würde.

	// kopieren des gesamten Buffers
	if ( rdlen <= WmvFileBuffer.Length - 4096 )
		stream.Write( WmvFileBuffer, rdlen, 4096 );

	else{	// kopiert den Rest hinten dran
		stream.Write( WmvFileBuffer, rdlen, WmvFileBuffer.Length - rdlen );
  		rdlen += ( WmvFileBuffer.Length - rdlen );
		break; // Fertig
	}
	rdlen += 4096;
}
 
Zuletzt bearbeitet:
cosmochaosmaker hat gesagt.:
:rolleyes: Danke für die konstruktiven vorschläge! :rolleyes:

Also wir können auch nicht alles Wissen :suspekt: Aber jetzt mal ehrlich deine Frage war schon was sehr spezielles :) Und das dauert meist bissel länger bis eine Antwort kommt. Wie bist du auf die Lösung gekommen?
 
Nachdem ich gemerkt habe das ich bei'm Lesen den letzen Block nicht an die richtige Stelle gesetzt habe.
Und das ich mich bei'm schreiben gar nicht vorwärts bewegt habe. *an den Kopf greif*

Ich hab mal meinen Quellcode mal kommentiert damit man das besser nachvollziehen kann.

MFG cosmo
 

Neue Beiträge

Zurück