.NET filesystemwatcher - это был файл или каталог? - PullRequest
30 голосов
/ 26 июля 2010

Есть ли способ определить с помощью FSW, был ли удален файл или каталог?

Ответы [ 4 ]

35 голосов
/ 26 июля 2010

Вот упрощенная и исправленная версия решения fletcher:

namespace Watcher
{
    class Program
    {
        private const string Directory = @"C:\Temp";
        private static FileSystemWatcher _fileWatcher;
        private static FileSystemWatcher _dirWatcher;

        static void Main(string[] args)
        {
             _fileWatcher = new FileSystemWatcher(Directory);
             _fileWatcher.IncludeSubdirectories = true;
             _fileWatcher.NotifyFilter = NotifyFilters.FileName;
             _fileWatcher.EnableRaisingEvents = true;
             _fileWatcher.Deleted += WatcherActivity;

            _dirWatcher = new FileSystemWatcher(Directory);
            _dirWatcher.IncludeSubdirectories = true;
            _dirWatcher.NotifyFilter = NotifyFilters.DirectoryName;
            _dirWatcher.EnableRaisingEvents = true;
            _dirWatcher.Deleted += WatcherActivity;

            Console.ReadLine();
        }

        static void WatcherActivity(object sender, FileSystemEventArgs e)
        {
            if(sender == _dirWatcher)
            {
                Console.WriteLine("Directory:{0}",e.FullPath);
            }
            else
            {
                Console.WriteLine("File:{0}",e.FullPath);
            }
        }
    }
}
1 голос
/ 07 апреля 2014

Ваш вопрос имеет смысл, только если по одному пути могут быть файл и каталог с одинаковым именем.Например, если у вас есть имена файлов без расширения или каталоги с расширением.

Если ваши каталоги и файлы следуют обычным соглашениям, просто проверяйте наличие расширения в полном пути (bool iSDirectory = Path.GetExtension(e.FullPath).Equals("");), которое работает независимо от того, существует файл / каталог или нет, потому что метод просто анализируетуказанный путь и не имеет никакого отношения к файлу.

Если вам приходится сталкиваться с нетрадиционными проблемами, о которых я говорил в начале, вы можете проверить, существует ли каталог или файл в этом месте.Если этого не происходит, вы рассматриваете их, как если бы оба были удалены.Если один из них существует, другой обрабатывается так, как если бы он был удален.

Ваш запрос подразумевает, что вы где-то храните список файлов и каталогов, поэтому, проверяя этот список, вы можете принять решение об обработке.

Я думаю, что этот подход лучшеданное решение использует два наблюдателя файловой системы, чтобы определить разницу.

0 голосов
/ 26 марта 2014

Сначала я временно использую функцию «Путь», но позже, в случае не удаления, я исправляю ее с помощью Directory.Exists.Однако это не исправляет случай удаления

bool isDirectory = Path.GetExtension(e.FullPath) == string.Empty;


if (e.ChangeType != WatcherChangeTypes.Deleted)
{
    isDirectory = Directory.Exists(e.FullPath);
}
0 голосов
/ 26 июля 2010

Вы можете запросить свойство FileSystemEventArgs.FullPath, чтобы определить, является ли он каталогом или файлом.

if (Path.GetFileName(e.FullPath) == String.Empty) 
{
    //it's a directory.
}

Чтобы проверить, является ли это файл или каталог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...