2013-10-29 60 views
3

讓我解釋一下我在做什麼:我爲Paint.NET編寫了一個Filetype插件,我希望插件測試各種自定義編碼方法並使用生成最小尺寸的方法保存文件文件大小。返回流的C#函數

這裏是我的實際代碼(簡化了很多隻是爲了演示我想要做什麼)。這工作,除,很好,看到評論:

private void encode1(Stream output) 
{ 
    output.WriteByte(0xAA); 
} 
private void encode2(Stream output) 
{ 
    output.WriteByte(0xAA); 
    output.WriteByte(0xBB); 
} 

protected override void OnSave(Stream output) 
{ 
    if (saveSmallest) 
    { 
     // I can't find a clean way to test for the smallest stream size 
     // and then use the encoder that produced the smallest stream... 
    } 
    else if (selectedEncoder == 1) 
    { 
     encode1(output); 
    } 
    else if (selectedEncoder == 2) 
    { 
     encode2(output); 
    } 
} 

因此,這裏是我試了一下(也簡化但這個想法是在這裏),但它沒有工作,什麼也沒有寫在文件中任何情況下,我不知道爲什麼:

private Stream encode1() 
{ 
    Stream output = new MemoryStream(); 
    output.WriteByte(0xAA); 
    return output; 
} 
private Stream encode2() 
{ 
    Stream output = new MemoryStream(); 
    output.WriteByte(0xAA); 
    output.WriteByte(0xBB); 
    return output; 
} 

private void copyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[128]; 
    int read; 
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, read); 
    } 
} 

protected override void OnSave(Stream output) 
{ 
    if (saveSmallest) 
    { 
     // get encoders's streams 
     Stream[] outputs = 
     { 
      encode1(), 
      encode2(), 
      //other encoders here 
     }; 

     // Find the smallest stream 
     int smallest = 0; 
     for (int i = 1; i < outputs.Length; i++) 
     { 
      if (outputs[i].Length < outputs[smallest].Length) 
      { 
       smallest = i; 
      } 
     } 
     //Copy the smallest into the final output 
     //output = outputs[smallest]; 
     copyStream(outputs[smallest], output); 
    } 
    else if (selectedEncoder == 1) 
    { 
     //output = encode1(); 
     copyStream(encode1(), output); 
    } 
    else if (selectedEncoder == 2) 
    { 
     //output = encode2(); 
     copyStream(encode2(), output); 
    } 
} 

我也試圖與字節數組,而不是流工作,但字節的問題是,我必須聲明一個字節數組,它是非常大的,因爲我顯然是沒有的想法多少字節將需要編碼。它可能是數百萬...

我是C#的初學者。請告訴我爲什麼它根本不起作用,以及我如何解決它,或者如果您有任何想法如何改進。但是請不要編寫複雜的代碼,一旦編譯後需要多2kb的代碼,我希望代碼小巧,簡單和高效。我對低層次的編程感覺更好......先謝謝了!

+2

您可能想要一個'Func '代表陣列 –

+0

謝謝,我會尋找代表,從來沒有使用過它們,我也不知道它們如何對我有用^^ – guix

回答

3

嘗試Stream.Seek(0l, SeekOrigin.Begin);複製流之前。

+0

也許不會在返回之前,因爲他想要比較每個的大小(當前位置)。但是,是的,他應該在複製到文件之前倒帶。 –

+0

@BenVoigt thanx,爲案件更新。 – neeKo

+0

謝謝,我在copyStream的開頭添加了這一行:input.Seek(0,SeekOrigin.Begin);它的工作! – guix