2016-08-31 4 views
-3

私は、Windowsでファイルを読み込んで、OSレベルのロックを避けて、アプリケーションがファイルを読み込んでいる間でもファイルを削除できるようにする必要があります。ある "ファイルの終わり" までWindowsでハンドルを閉じた後でもファイルを読む方法は?

  1. のCreateFile
  2. のReadFile(複数回:C++、Pythonの、Java(登録商標)などを介して、典型的な読み出し動作を使用

    procmonを介して評価呼び出すときWINAPIの同じ予想されるシーケンスを明らかにする

CLOSEFILE)

  • に達した私は)基本的にCreateFile後とCLOSEFILE前に(ステップ1と3の間にエクスプローラ経由でファイルを削除しようとすると、私は」ファイルを取得します使用 "エラー。

    しかし、私はDropboxのは、サーバーにアップロードするファイルを読み込むとき、シーケンスがあることに気づい:

    1. のCreateFile
    2. CLOSEFILE
    3. のReadFile
    4. を繰り返して、1-3
    手順

    ReadFileはCloseFileの後に呼び出されるため、Dropboxがファイルを読み込んでいる間でもファイルを削除できます。

    CloseFileが呼び出された後、WinapiがReadFileをどのように許可するのか分かりません。

    Dropboxの動作を示すProcmonのスクリーンショットを添付しました。

    これはどのように行われたのですか?

    Procmon showing Dropbox

  • +4

    CreateFileを複数回呼び出しても有効ですが、カウントするだけです。 CloseHandleでCreateFileをカウントダウンします。読み込み直後のCloseHandleは、最後のハンドルを本当に破棄し、スクリーンショットの最初のCreateFileとペアを作成したものです。だからあなたの前提は妥当ではない。 –

    +0

    :(あなたが正しいです...私は愚かだと思います。ありがとう@HansPassant :) – dejuknow

    +3

    oplockが壊れているときに通知するために、ファイルにoplock(oplock)を使用してFSCTL_REQUEST_OPLOCKを使用することができます。 - https://msdn.microsoft.com/en-us/library/windows/desktop/aa365433(v=vs.85).aspx – RbMm

    答えて

    0

    この作成-クローズ読みセマンティクスは、ファイルは、アプリケーションのアドレス空間内のメモリ領域にマッピングされていることに起因する必要があります。アプリケーションがその領域からの読み取りを試みると、オペレーティングシステムはファイルから必要なデータを読み取り、それらをアプリケーションに配信します(データはファイルがマップされているメモリ領域に表示されます)。

    メモリマップされたファイルは、ファイルマッピングオブジェクト(カーネルワールドのセクションと呼ばれます)によってバックアップされます。ファイルハンドルが与えられた場合、CreateFileMappingでそのようなオブジェクトを作成し、それをアドレス空間にMapViewOfFileでマッピングすることができます(一部のExバリアントも存在します)。ファイルマッピングオブジェクトは、マップするファイルへの余分な参照を保持します。したがって、ファイルのファイルマッピングオブジェクトを作成した後、ファイルハンドルを閉じて、ファイルマッピングオブジェクトを通じてファイルを読み取ることができます。