4

ハッシュを使用するファイルを扱うコードを書いています。チャンクを読み取り、ハッシュし、書き込み、別のチャンクを読み取る必要があります。

言い換えれば、私はたくさんの読み書きをする必要があります。これは本当に簡単だと思いますが、プロが実行したかっただけです...

次のようなことを行うことは可能であり、受け入れられますか?

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

ファイルを開いたり書き込んだりしようとしているときに、ある種の競合するファイル ストリーム エラーが発生したことを覚えています。問題は 2 つのファイル ストリームですか? 読み取りと書き込みを行うストリームを 1 つ持つことはできますか?

4

1 に答える 1

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);
}
于 2011-12-28T05:27:15.780 に答える