0

C# と Dokan ライブラリを使用してファイルシステムを作成していますが、WriteFile で行き詰まりました。

 public int WriteFile(
            String filename,
            Byte[] buffer,
            ref uint writtenBytes,
            long offset,
            DokanFileInfo info)
        {           
            try
            {
                FileStream fs = File.OpenWrite( GetFullPath(filename) , FileMode.Open );              
                fs.Seek(offset, SeekOrigin.Begin);
                fs.Lock(offset, buffer.Length);
                fs.Write(buffer, 0, buffer.Length);
                fs.Unlock(offset, buffer.Length);
                writtenBytes = (uint)buffer.Length;
                return 0;
            }
            catch (Exception e)
            {
                Console.WriteLine("FAIL WriteFile {0}", e.Message);
                return -1;
            }
        }

アプリを実行して Dokan の仮想ドライブから txt ファイルを開くと、行を追加して保存しようとします。メモ帳から「パラメーターが正しくありません」というエラーが表示されます。

コードでは、 File.OpenWrite() 呼び出しで例外が発生します。例外は System.IO.IOException です。メッセージ: 「別のプロセスで使用されているため、プロセスはファイル foo.txt にアクセスできません。」

  • ファイルはメモ帳でのみ開きます。
  • Dokan ライブラリで提供される Mirror サンプルでも同じ動作が見られます
  • マニフェストで自分のプログラムに管理者権限を追加しましたが、役に立ちませんでした

Dokan はプロキシとして機能し、ユーザーが定義した WriteFile を呼び出すことができるはずですよね? 書き込みのためにロックされている場合、どうすればこれを行うことができますか?

助けてください。Dokan を使用した経験があるか、Dokan が機能しない理由の手がかりがあるかもしれません。

使用しています - Win 7 Pro x64 - 64 ビット Dokan ドライバー - アプリは x86 としてコンパイルされています

4

1 に答える 1

1

メソッドを終了する前に、ストリームで Dispose を呼び出す必要があります。それは最善の解決策ではありません。CreateFile でファイル ストリームを構築し、それを info.Context に渡し、それを ReadFile 、 WriteFile で使用し、Cleanup で dispose を呼び出す必要があります。

于 2012-02-19T10:39:14.720 に答える