WriteFile等、非同期I/Oで長くお待たせすると、エラーが出るようです。凡そ4秒と感じます。
「ファイルのコピー」
「予期しないエラーのため、ファイルをコピーできません。このエラーが再発する場合は、エラーコードを使用して、この問題についてのヘルプを検索してください。」
「エラー0x800705AA: システムリソースが不足しているため、要求されたサービスを完了できません。」
「再試行」「スキップ」「キャンセル」
「すべての項目にこれを実行する」
対策は、検討中です。

というのも、1MBの書き込み要求が来たとしても、実ファイルがネットワーク上に存在するならば、すぐには完了できない可能性が高い。そこで非同期、という選択なんでしょうけれども。。。エクスプローラのファイルコピーでこの挙動が見られます。
返信削除DokanNet.DokanResetTimeout(millisecs, info); でタイムアウト時間を延長できるようです。
返信削除参考:
https://groups.google.com/forum/#!topic/dokan/ARppEKQWpbQ
https://groups.google.com/forum/#!topic/dokan/a87cgpzt0nU
補足。エクスプローラのファイルコピーでは、1MBの非同期書き込みを5つ同時に走らせてきます。。。単純に、タイムアウト時間を5倍にして計算するべきか。
返信削除Windows 7では、5つ同時にWriteFileが来る状況です。
返信削除勿論、offsetとlengthは被らないように設定されてから、呼ばれるので、問題は無いのですが、、、
要は処理する順番です。
どうも lock (...) { } や Semaphore や ReaderWriterLock を用いますと、先に来た人が待たされる傾向が有ります。
この現象がタイムアウトエラーを引き起こすきらいが有りますので、先入れ・先出しを確実に実行する為、独自にコーディングして回避しました。
「5つ同時」については、DokanOptions.ThreadCountが関係するようです。
返信削除また、DokanNet.DokanResetTimeoutを呼んだとしても、エクスプローラが「60秒しか待たない」という状況設定が有るようで、苦慮しています。
Process Monitor Sysinternalsで調査しました。
返信削除SHELL32.dllのSHFileOperationExが呼び出されています。詳細な動きはその中で隠ぺいされており、不明です。1MBずつReadFileし、64KBずつWriteFileしているようです。
ProcessMonitorとPEBrowseProfessionalの合わせ技で、_SHCopyStreamWithProgressAndErrorCauseItemから、関係が有りそうなレジストリの場所を取得しました。
返信削除Software\Policies\Microsoft\Windows\System
CopyFileChunkSize
CopyFileOverlappedCount
Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
CopyBufferSize
結局、ThreadCount 5→2 で対応しました。
返信削除