ファイルまたはディレクトリが削除されたかどうかをFSWで判断する方法はありますか?
これは、フレッチャーのソリューションの簡略化および修正されたバージョンです。
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);
}
}
}
}
あなたの質問は、同じパスに同じ名前のファイルとディレクトリが存在する可能性がある場合にのみ意味があります。例えば拡張子のないファイル名または拡張子のあるディレクトリがある場合。
ディレクトリとファイルが通常の規則に従っている場合は、フルパス(bool iSDirectory = Path.GetExtension(e.FullPath).Equals("");
)に拡張子が存在するかどうかを確認するだけです。これは、ファイル/ディレクトリが存在するかどうかに関係なく機能します。これは、メソッドがパスを解析するだけだからです。与えられ、ファイルとはまったく関係がありません。
最初に述べた非従来型の問題に対処する必要がある場合は、couldその場所にディレクトリまたはファイルが存在するかどうかを確認します。どちらもそうでない場合は、両方が削除されたかのように扱います。それらの1つが存在する場合は、もう1つを削除されたかのように扱います。
あなたの問い合わせは、ファイルとディレクトリのリストをどこかに保持していることを意味します。そのため、そのリストと照合して、処理について決定を下すことができます。
このアプローチは、違いを区別するために2つのファイルシステムウォッチャーを使用するソリューションよりも優れていると思います。
最初は一時的に「パス」機能を使用しますが、後で削除しない場合はDirectory.Existsで修正します。ただし、削除の場合は修正されません
bool isDirectory = Path.GetExtension(e.FullPath) == string.Empty;
if (e.ChangeType != WatcherChangeTypes.Deleted)
{
isDirectory = Directory.Exists(e.FullPath);
}
FileSystemEventArgs.FullPath
プロパティに問い合わせて、それがディレクトリかファイルかを判断できます。
if (Path.GetFileName(e.FullPath) == String.Empty)
{
//it's a directory.
}
それがファイルかディレクトリかを確認します。