2011-07-22 91 views
0

大きなデータを読み書きするプログラムがあります。読み取りと書き込みは、書き込みがローカルドライブ上のファイルに対して行われているときにうまく機能します。ターゲットがネットワーク共有で、同じプログラムの2つのインスタンスを実行すると、最初に起動したプログラムがWriteFileでハングします。デバッグすると、ネットワーク共有のWriteFileがブロックされています。ネットワーク共有を介してファイルにWriteFile

WaitForSingleObject(タイムアウト60秒)でWriteFileにオーバーラップIOを実装しました。今やWriteFileはもはやブロックされませんが、一度データ全体が一度ネットワークを介して書き込まれるとさえもなりません。ネットワーク共有経由でWriteFileを使用すると、再試行を考慮する必要がありますか?ネットワーク経由でファイルに正しくWriteFileを使用するには?

更新:

私はWriteFile関数で重複IOを実装するには次のリンクを参照さ。

http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/a5e9514b-53e0-410c-a975-41a5ca91e4be

リンクは、私はGENERIC_READずに一人でGENERIC_WRITEでのCreateFileを使用していると言います。しかし、ファイルからも読みたい場合はどうしたらいいですか?WriteFile用にasyn ioを実装できないということですか?実際には、オーバーラップIOでファイルに書き込む前に、同じファイルからヘッダーを読み込む必要があります。これどうやってするの??

答えて

0

オーバーラップIOを使用するあなたのアプローチは正しいです。しかし、どれだけ多くのデータを1つに書き込んでいますか? WriteFileは失敗に終わり、再試行を実装する必要はありません。ただし、全体として書くのではなく、部分的にデータを書き込むことができます。

ファイル共有を使用していると言われました。つまり、ファイルに書き込むことです。代わりにCopyFileを使わないでください。すべてのデータをファイルにコピーしてネットワーク経由で送信しますか?

+0

readfileはバッファにデータを非同期的に読み込み、バッファはwritefileに渡されます。これは速度のために最適化された生のファイルIOです。問題は、ネットワーク共有にデータを書き込もうとするときだけです。この場合、再試行は意味がありますか? –

+0

私はこの答えを得たと思う。 1つのMSDNフォーラムリンクによると、GENERIC_READ | GENERIC_WRITEフラグを持つCreateFileはWriteFile関数と同期して動作します。しかし、CreateFileでGENERIC_WRITEだけを使用すると、ネットワーク接続がダウンするとWriteFileがネットワークエラーを返します。テストして同じことを確認します。 –

関連する問題