0

FileSystemWatcherディレクトリからの変更を追跡するために使用しています。問題は、監視しているサブディレクトリ内に最近作成されたサブディレクトリを追跡して変更を加えなければならないことです。今のところ、Changeイベントを使用して変更を検出し、ディレクトリであるかどうかを確認し、そのサブディレクトリFullPathの新しいインスタンスを作成しています。FileSystemWatcher

private static void StartMonitoringDir(string dir)
        {
            var fileWatcher = new FileSystemWatcher(dir)
            {
                EnableRaisingEvents = true,
                Filter = "*.exe"
            };

            var folderWatcher = new FileSystemWatcher(dir)
            {
                EnableRaisingEvents = true
            };

            fileWatcher.Created += FileWatcherOnCreated;
            fileWatcher.Changed += FileWatcherOnChanged;
            folderWatcher.Created += FolderWatcherOnCreated;
        }

private static void FolderWatcherOnCreated(object sender, FileSystemEventArgs e)
        {
            var attr = File.GetAttributes(e.FullPath);

            if (attr != FileAttributes.Directory) return;

            StartMonitoringDir(e.FullPath);
        }

それで、ここに問題があります。ディレクトリを作成するとすぐにChangedその名前でイベントが発生する"New Folder"ため、ユーザーがこのフォルダーの名前を変更してその内部を変更すると、ユーザーが名前を付けたフォルダーで"New Folder"はなく、フォルダーの古い名前が取得されます。ディレクトリ名が間違っているため、フォルダの新しい名前が何であるかを知る方法がなく、変更を加えることができません。

4

1 に答える 1

1

誰かが「新しいフォルダー」フォルダーを置き去りにすることを心配する必要がない場合は、「FolderWatcherOnCreated」イベント ハンドラーを削除し、代わりにFileSystemWatcher.Renamed イベントハンドラーを使用します。

このような方法でうまくいくかもしれません (私はコードをテストしていません):

folderWatcher.Renamed += FolderWatcherOnRenamed;

private static void FolderWatcherOnRenamed(object sender, RenamedEventArgs e)
{

    var attr = File.GetAttributes(e.FullPath);

    if (attr == FileAttributes.Directory && e.OldName == "New Folder")
    {

        StartMonitoringDir(e.FullPath)
    }
}
于 2013-04-28T03:07:52.830 に答える