2011-12-28 4 views
4

私はハッシュを使用するファイルを扱うコードを書いています。私はチャンクを読み取る必要がある、それをハッシュし、別のチャンクを読んで、その後、それを書く、などバイナリリーダーとライタが同時に開いていますか?

言い換えれば、私は読み取りと書き込みの多くを行う必要があります。私はいくつかの種類に実行していることを覚えて

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

のような何かをすることが可能、と受け入れられる...私は、これは本当に簡単であると確信しているが、私はちょうどプロでそれを実行したいですファイルのオープンと書き込みを試したときに衝突するファイルストリームのエラーが発生しました。私はそれを得るために何をしたのか分かりません。それは問題の2つのファイルストリームですか?読み書きするストリームを1つ設定できますか?

+0

これは汚いと思います。なぜあなたはそれをこのようにしていますか?おそらくあなたのシナリオを説明できますか? – Matthias

答えて

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

+2

@Walkerneo - あなたはそれをお勧めしたいと思います。ファイルハンドリングはキャッシュで最適化され、シークはあまり最適化されません(テストを実行すると表示されます)。それに加えて、私の指摘は、APIの柔軟性と安全性を考慮して、読み書きのために1つのファイルハンドルで作業するときに緩くなることでした – Polity

関連する問題