Uveďte prosím ještě přesný výpis té vaší exception. S vaší konkrétní chybou to může i nemusí souviset, ale v kódu máte dvě chyby: 1) Kopírování zdrojového do cílového streamu provádíte chybně. Jednak při čtení ze streamu má metoda Read (nebo ReadAsync ve vašem případě) právo vrátit méně dat než je požadováno parametrem count (u FileStreamu se tak běžně děje). Toto dá metoda najevo svojí návratovou hodnotou, ve které je skutečná délka přečtených dat. Tu vy ale zcela ignorujete. Je to popsáno přímo u metody i na MSDN (http://msdn.microsoft.com/en-us/library/.... A jednak váš kód úplně zbytečně spoléhá na to, že zdrojový stream podporuje vrácení celkové velikosti vlastností Length, což je sice u souboru splněno, ale v případě obecného streamu rozhodně již nikoliv. Také tento kód nemusíte vůbec psát vy, ale stačí použít exitující metodu Stream.CopyTo (existuje od FW 4.0) nebo Stream.CopyToAsync (od FW 4.5) viz http://msdn.microsoft.com/en-us/library/.... Implementace metody CopyTo je obecná a korektní a pro info vypadá nějak takto:
public static void CopyTo(this Stream source, Stream destination, int bufferSize = 0x1000)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
if (destination == null)
{
throw new ArgumentNullException("destination");
}
if (bufferSize <= 0)
{
throw new ArgumentOutOfRangeException("bufferSize");
}
if (!source.CanRead)
{
throw new NotSupportedException("Source stream does not support reading");
}
if (!destination.CanWrite)
{
throw new NotSupportedException("Destination stream does not support writing");
}
byte[] buffer = new byte[bufferSize];
int length = buffer.Length;
int readed;
while ((readed = source.Read(buffer, 0, length)) != 0)
{
destination.Write(buffer, 0, readed);
}
}
2) Vstupní soubor držíte otevřený ještě i po celou dobu zobrazeného MessageBoxu (pomineme-li to, že zobrazení chybové hlášky by vůbec neměla být zodpovědnost této metody).
|