ホームページ  >  記事  >  バックエンド開発  >  FSCTL_ENUM_USN_DATA を使用して NTFS ボリューム上のファイル変更を効率的に検出する方法

FSCTL_ENUM_USN_DATA を使用して NTFS ボリューム上のファイル変更を効率的に検出する方法

DDD
DDDオリジナル
2024-11-04 10:07:30185ブラウズ

How to Efficiently Detect File Changes on NTFS Volumes with FSCTL_ENUM_USN_DATA?

NTFS ボリューム上のファイル変更の検出

Q: NTFS ボリューム上で削除、変更、作成されたファイルのみを効率的に検出するにはどうすればよいですか?

A: FSCTL_ENUM_USN_DATA 関数を使用して、ボリューム上のすべてのファイルを列挙できます。この関数は、ファイルのフラグと USN を含むファイル レコードのリストを提供するため、変更を迅速に識別できます。

実装の詳細:

提供されるコード サンプルでは、​​FSCTL_ENUM_USN_DATA: ファイル レコードを取得し、変更をフィルタリングして関連情報を表示します。

<code class="c++">#include <Windows.h>
#include <stdio.h>

// ...

void check_record(USN_RECORD *record)
{
    // Check for specific file name or criteria
    // ...

    show_record(record);
}

int main(int argc, char ** argv)
{
    // Initialize variables
    // ...

    for (;;)
    {
        // Call FSCTL_ENUM_USN_DATA to get file records
        // ...

        record = (USN_RECORD *)((USN *)buffer + 1);
        recordend = (USN_RECORD *)(((BYTE *)buffer) + bytecount);

        while (record < recordend)
        {
            filecount++;

            check_record(record);

            record = (USN_RECORD *)(((BYTE *)record) + record->RecordLength);
        }

        mft_enum_data.StartFileReferenceNumber = nextid;
    }

    // ...
}</code>

追加メモ:

  • FSCTL_ENUM_USN_DATA は、既存のファイルに関する情報のみを返す高速なメソッドです。
  • 完全なファイル パスを取得するには、親 ID をディレクトリのファイル ID と照合できます。
  • によって返されるデータのキャッシュを検討してください。パフォーマンスを向上させるための FSCTL_ENUM_USN_DATA
  • FSCTL_ENUM_USN_DATA を定期的に呼び出して、最後のスキャン以降に加えられた変更をキャプチャする必要があります。

以上がFSCTL_ENUM_USN_DATA を使用して NTFS ボリューム上のファイル変更を効率的に検出する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。