1

いっぱいになるファイルがあるので、同時に行う方がよいかどうかを考えました。

ノート:

  1. 複数のコンピューターから同時にファイルを取得します。
  2. StartWrite を呼び出す前に毎回位置を設定します。-> 使用するたびにロックする必要がありますか?

それは良いスローションですか?もっと良いものはありますか?

ところで、 Stream.Flush() とは何ですか?

ありがとう。

4

3 に答える 3

2

ストリームがスレッドセーフであったとしても、非アトミックに位置を設定して書き込む必要があるため、これは原則として安全ではありません。

ネイティブのWindowsファイルAPIはこれをサポートしていますが、.NETはサポートしていません。Windowsは、同じファイルへの同時IOを完全に実行できます(Windowsがこれをサポートしていなかった場合、SQL Serverはどのように機能しますか?)。

FileStreamスレッドごとに1つの書き込みを使用することをお勧めします。

于 2012-09-08T15:55:03.510 に答える
2

いいえ、それは概念的に間違っているでしょう。Stream(System.IO.Streamクラスを意味すると思います)は抽象クラスです。オブジェクトをインスタンス化するときは、多くの子クラスの1つを使用しています。

子クラスについて何かを仮定することは、次の理由で間違ったアプローチです。

a)コードに変更を加えた後、実際の子クラスの実装が何をするのかわからない人が来る可能性があります。b)可能性は低いですが、実装は変更される可能性があります。たとえば、誰かがあなたのコードをMonoフレームワークにインストールした場合はどうなりますか。

FileStreamクラスを使用している場合は、 FileShareパラメーターをWriteに設定して、同じ基になるファイル上に2つ(またはそれ以上)のFileStreamオブジェクトを作成することを検討してください。このようにして、同時書き込みが発生する可能性があることを指定しますが、各ストリームには独自のロケーションポインターがあります。

更新:今だけ私はあなたのコメントを見ました「各コンピュータは私に開始インデックス、終了インデックスとバイト[]でパーツを送ってくれます」。実際、このシナリオでは複数のFileStreamが正常に機能するはずです。

    void DataReceived(int start, byte[] data)
    {
        System.IO.FileStream f = new System.IO.FileStream("file.dat", System.IO.FileMode.Open, System.IO.FileAccess.Write, System.IO.FileShare.ReadWrite);
        f.Seek(start, System.IO.SeekOrigin.Begin);
        f.Write(data, start, data.Length);
        f.Close();
    }
于 2012-09-08T15:55:52.997 に答える