0

Windows でファイルを一意に識別する必要があるため、ファイルが移動または名前変更された場合でも、常にそのファイルを参照できます。私はいくつかの調査を行い、C ++でGetFileInformationByHandleメソッドを使用する方法でWindowsの一意のファイル識別子という質問を見つけましたが、明らかにそれはNTFSパーティションでのみ機能し、FATパーティションでは機能しません。

DropBox のような動作をプログラムする必要があります。コンピューターで閉じてファイルの名前を変更し、もう一度開くと、その変更が検出され、正しく同期されます。皆さんが知っていれば、そのテクニックと、おそらくDropBoxがどのように機能するのだろうか。

たとえば FileSystemWatcher は機能しますが、それを使用しているプログラムが閉じられている場合、変更は検出されません。

C# を使用します。

ありがとう、

4

2 に答える 2

4

次善の方法 (ただし、すべてのファイルを完全に読み取ることを含む方法で、助けられる場合は避けます) は、ファイル サイズとファイル コンテンツのハッシュ (SHA-256 など) を比較することです。特に通常の状況下では、両者が衝突する確率はかなり低いです。

NTFS では GetFileInformationByHandle の方法を使用し、FAT ボリュームではハッシュにフォールバックします。

Dropbox の場合、バックグラウンドで実行されているサービスまたはプロセスがファイル システムの変更を監視していると思います。上記のサービス/プロセスを停止すると機能しなくなったとしても、これが最も信頼できる方法です。

于 2012-07-21T23:15:07.800 に答える
0

ユーザーが探していたのは、おそらく Windows Change Journal でした。これらは、ファイルの名前変更などの変更を永続的に追跡します。ウォッチャーが常に実行されているファイル システム イベントを監視する必要はありません。代わりに、ログを最後にいつ参照したかを維持し、その時点から再度参照を続ける必要があります。ある時点で、既知の ID を持つファイルにタイプ RENAME のイベントがあり、そのイベントに関心のある人は誰でも、そのファイルの独自のバージョンに対して同じことを行うことができます。もちろん、重要なことは、ファイルに使用されている ID を追跡することです。

自動バックアップ アプリケーションは、タスクを実行するためにボリュームの状態の変化をチェックする必要があるプログラムの一例です。ディレクトリまたはファイルの変更をチェックする強引な方法は、ボリューム全体をスキャンすることです。ただし、システム パフォーマンスが低下するため、この方法は受け入れられないことがよくあります。もう 1 つの方法は、バックアップするディレクトリのディレクトリ通知をアプリケーションで登録することです (FindFirstChangeNotification または ReadDirectoryChangesW 関数を呼び出します)。これは最初の方法よりも効率的ですが、アプリケーションが常に実行されている必要があります。また、多数のディレクトリとファイルをバックアップする必要がある場合、そのようなアプリケーションの処理量とメモリ オーバーヘッドによって、オペレーティング システムのパフォーマンスが低下する可能性もあります。

これらの欠点を回避するために、NTFS ファイル システムは更新シーケンス番号 (USN) の変更ジャーナルを維持します。ボリューム内のファイルまたはディレクトリに変更が加えられると、そのボリュームの USN 変更ジャーナルが、変更の説明とファイルまたはディレクトリの名前で更新されます。

https://docs.microsoft.com/en-us/windows/win32/fileio/change-journals

于 2021-07-16T14:57:49.210 に答える