2011-12-28 27 views
4

我正在編寫處理使用散列的文件的代碼。我需要讀一塊,然後散列它,然後寫它,然後讀另一個塊,等等。Binary Reader和Writer同時打開?

換句話說,我需要做大量的閱讀和寫作。我敢肯定,這是非常簡單的,但我只是想通過專業人士來運行它...

是否有可能和可接受的做一些事情,如:

BinaryReader br = new BinaryReader (File.OpenRead(path)); 
BinaryWriter bw = new BinaryWriter (File.OpenWrite(path)); 
br.dostuff(); 
bw.dostuff(); 

我記得運行到某種在試圖打開和寫入文件時遇到衝突的文件流錯誤,我不確定我爲了得到它而做了什麼。這是兩個文件流,這是問題嗎?我可以有一個流來讀取和寫入?

+0

我覺得這很髒。你爲什麼這樣做?也許你可以解釋你的情況? – Matthias 2011-12-28 05:02:38

回答

2

這是完美的可能和理想,技術性,如果你的寫法不改變文件的長度,並始終落後於讀者,這應該不會給任何問題。事實上,從API的角度來看,這是可取的,因爲這允許用戶控制從哪裏讀取以及在哪裏寫入。 (這是推薦的寫入不同文件的規範,如果在加密過程中發生任何不好的事情,您的輸入文件將不會被混淆)。

喜歡的東西:

protected void Encrypt(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[2048]; 

    while (true) 
    { 
     // read 
     int current = input.Read(buffer, 0, buffer.Length); 
    if (current == 0) 
        break; 

     // encrypt 
     PerformActualEncryption(buffer, 0, current); 

     // write 
     output.Write(buffer, 0, current); 
    } 
} 

public void Main() 
{ 
    using (Stream inputStream = File.Open("file.dat", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
    using (Stream outputStream = File.Open("file.dat", FileMode.Open, FileAccess.Write, FileShare.ReadWrite)) 
    { 
     Encrypt(inputStream, outputStream); 
    } 
} 

現在,因爲你使用的是加密的,我甚至會建議在另一個專門的流進行實際的加密。這很好地清理了代碼。

class MySpecialHashingStream : Stream 
{ 
... 
} 

protected void Encrypt(Stream input, Stream output) 
{ 
    Stream encryptedOutput = new MySpecialHashingStream(output); 
    input.CopyTo(encryptedOutput); 
} 
+0

原來我可以使用相同的文件流... – mowwwalker 2011-12-28 08:22:22

+2

@Walkerneo - 你可以,但我wouldnt推薦它。文件handeles使用緩存進行優化,Seeking沒有被優化(做一個測試,你會看到)。除此之外,我的觀點是允許API的靈活性和安全性,當你只用一個文件句柄來讀寫時 – Polity 2011-12-28 10:32:46

相關問題