C#を使用して同様の機能を実装しました。 FileSystemWatcherは、大きなディレクトリツリーでは効率的ではありませんでした。
私たちの代わりに、次のWindows API呼び出しを使用して、FSNodes
、私たちが作成した構造体を使用していました:
[StructLayout(LayoutKind.Sequential)]
private struct FILETIME
{
public uint dwLowDateTime;
public uint dwHighDateTime;
};
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
private struct WIN32_FIND_DATA
{
public FileAttributes dwFileAttributes;
public FILETIME ftCreationTime;
public FILETIME ftLastAccessTime;
public FILETIME ftLastWriteTime;
public uint nFileSizeHigh;
public uint nFileSizeLow;
public int dwReserved0;
public int dwReserved1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=MAX_PATH)]
public string cFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=MAX_ALTERNATE)]
public string cAlternate;
}
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool FindClose(IntPtr hFindFile);
[DllImport("kernel32", CharSet=CharSet.Unicode)]
private static extern IntPtr FindFirstFile(
string lpFileName, out WIN32_FIND_DATA lpFindFileData);
[DllImport("kernel32", CharSet=CharSet.Unicode)]
private static extern bool FindNextFile(
IntPtr hFindFile, out WIN32_FIND_DATA lpFindFileData);
は、私たちがやっていることは、静的な処理です。我々は、メタデータツリーをディスクに保存し、格納されたディレクトリツリーとロードされたものとを比較し、変更された(タイムスタンプ(速い)またはファイルハッシュに基づいて)検索する。また、削除されたファイル、追加されたファイル、移動されたファイル、移動されたファイル(ファイルハッシュに基づくファイル)も管理できます。
この実装は、それぞれのPOLL_TIMEを実行するデーモンと組み合わされており、私たちにとっては有効でした。それが役に立てば幸い。
すべてのサブフォルダは1つのルートの下にありますか? Windowsエクスプローラではどのような問題がありましたか?あなたがメッセージを見逃さないようにするためのパターンです。 http://stackoverflow.com/questions/4967095/c-predict-file-system-events-on-folder-delete/4968391#4968391 – adrianm
@adrianm:はい、同じルートです。 ---監視されたフォルダが変更されたとき、エクスプローラはそのビューを更新しませんでした。FSWがそのイベントを盗んだためです。 – mafu