2010-07-26 2 views
27

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

+0

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

+4

Это не «C# FileSystemWatcher». Это .NET FileSystemWatcher. Он работает так же хорошо со всеми .NET-языками, а не только с C#. –

+1

Мне кажется, что это может сработать, если вы запустили два отдельных FSW-мониторинга одного и того же каталога и отличались только их значениями «NotifyFiter». –

ответ

0

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

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

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

+2

Он был удален, так что эти вызовы потерпят неудачу, нет? –

+0

@Steven Sudit: Сначала вам нужно проверить свойство FileSystemEventArgs.ChangeType. –

+1

'File.GetAttributes' выдает« FileNotFoundException »для удалённого файла. –

33

Вот упрощенная и исправленный вариант решения Флетчера:

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

+1. Ваше решение намного проще – fletcher

+0

У меня есть ошибки, но вы уже придумали эту идею, прежде чем я это сделал. –

+1

Это решение не принимает во внимание, что оба 'FileSystemWatcher' работают на отдельных потоках. Таким образом, если в просмотренном каталоге много событий, порядок событий, который вы видите в приложении, может быть другим - т.е. вы можете записать, что файл был создан в каталоге, который еще не существует, за которым следует событие, которое создает указанный каталог. – Paya

1

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

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


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

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

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

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

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

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

Смежные вопросы