.NET filesystemwatcher - это файл или каталог?

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

Ответ 1

Здесь упрощенная и исправленная версия решения 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);
            }
        }
    }
}

Ответ 2

Я временно использую функцию "Путь", но позже, в случае отсутствия удаления, я исправляю ее по каталогу. Exists. Однако это не устраняет случай удаления

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


if (e.ChangeType != WatcherChangeTypes.Deleted)
{
    isDirectory = Directory.Exists(e.FullPath);
}

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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