2012-03-19 24 views
0

StreamWriterを使用して、あるファイルから別のファイルにチャンクをコピーしています。両方のファイルは同じリモートロケーションにありますが、ローカルマシン上でプロセスが実行されます。私はネットワークの不具合が発生した場合に回復してそのプロセスを継続しようとしています。私はコードをステップ実行し、特定の瞬間にネットワーク接続を無効にすることでこれをシミュレートしています。ネットワークリカバリの失敗後のスチームライターの処理

問題は、ネットワークを復旧させるときに、StreamWriterで何もできないことです。 Flush()Close()またはDispose()を呼び出すと、「指定されたネットワーク名は使用できなくなりました」というIOExceptionがスローされます。私のコードは次のようになります:

int charsToRead = 100; 
while(!inputFileStream.EndOfStream) 
{ 
    char[] block = new char[charsToRead]; 
    int charsRead = inputFileStream.ReadBlock(block, 0, charsToRead); 
    outputFileStream.Write(new string(block, 0, charsRead)); 
    outputFileStream.Flush(); 
} 

ネットワーク障害から回復した後にStreamWriterを続ける最良の方法は何ですか?ありがとう。

更新:私はテキストファイルを扱っています。

+2

あなたはUsing-blockに入れてみましたか? – Koen

+0

@Koenどのように役立つだろうか? – Default

+0

これはあなたの質問には触れませんが、 'StreamReader/-Writer'はバイトを読み取っておらず、*文字*を読むことを知っておくべきだと思います。あなたは実際に 'char []'を割り当てましたが、変数 'bytesRead'を呼び出しました。これは間違っています。ファイルが* text *ファイルの場合にのみ 'StreamReader/-Writer'を使うべきです。あらゆる種類のデータをコピーしたい場合は、 'FileStream'(' File.Open() 'を使って作成します)を使用してください。 – Timwi

答えて

0

宛先への書き込み中にネットワーク接続が切断された後、宛先ファイルの外観はどうなりますか?これは、回復戦略が必然的にそれに依存するため、知ることが重要です。

私は、宛先ファイルが0バイトにブランクアウトされている可能性が高いと考えています。それが起こった場合、残念ながらコピー済みのデータがなくなるため、コピー処理を再開することはできません。今すぐできることは、ストリームを再インスタンス化し、最初からコピーを再開することだけです。大きなファイルの場合、これは一時的なネットワーク障害が常に発生した場合には終了しない可能性があります。

ただし、ネットワーク障害が発生しても宛先ファイルに書き込むことができた場合は、File.Append()を使用してファイルを再オープンし、コピー処理を続行できます。読み取りと書き込みが再び同期するように、inputFile.Position = outputFile.Positionを使用する必要があります。

入力ファイルへのネットワーク接続が失敗した場合

は(あなたから読んでいる1)が、ちょうど File.Open()でそれを再オープンして、再度 inputFile.Position = outputFile.Positionを設定します。

上記のすべて

は、あなたが想定していた(私にはあなたが StreamReaderを使用して 文字を読んで、あなたが掲示1、より適切なアプローチを思わ バイト、などのデータを読み取るために Streamを使用する必要があることを前提としてい入力が テキストファイルであること)。

+0

私はStreamReader/Writerを使ってテキストファイルを処理しています。私はコードがフレームワークの一部であり、私はそのウサギの穴を降りたくないので、StreamReaderを使用しないことを好む。ネットワークが停止すると、destファイルは以前に書き込まれたテキストと同じ状態になります。私は現在、正常にコピーされた文字の数を追跡します。次に、入力ファイルを再度開き、 'inputFileStream.BaseStream.Seek(charsCopied、SeekOrigin.Begin)'で最後の文字を探します。これは正常に動作します。しかし、私は出力ファイルを再オープンする際に問題があります。私も成功したoutputFileStream = nullを試してみました。 – nthpixel

+0

①outputFileStreamを明示的に(好ましくは 'using'文で)閉じる必要があります。 ②コピー先のファイルを調べる以外は、どのくらいの文字が正常にコピーされたか分かりません。例外をスローする 'Write'への特定の呼び出しは、成功したか失敗した可能性があります。 ③私はその「ウサギの穴」の議論を買わない。間違ったツールを使って自分のウサギの穴を掘っている。 ④ '.Seek(x、SeekOrigin.Begin)'は '.Position = x'とまったく同じです。 – Timwi

関連する問題