Есть ли способ определить с FSW, если файл или каталог был удален?
.NET filesystemwatcher - это файл или каталог?
Ответ 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.
}
Чтобы проверить, является ли это файлом или каталогом.