2010-07-26 6 views
27

Gibt es eine Möglichkeit, mit dem FSW zu bestimmen, ob eine Datei oder ein Verzeichnis gelöscht wurde?.NET Dateisystemwächter - war es eine Datei oder ein Verzeichnis?

+0

Ich bin mir nicht sicher, ob Sie das können, ehrlich gesagt. Die offensichtliche Problemumgehung besteht darin, beim Start eine Liste von Verzeichnissen zu erstellen. Wenn es nicht in dieser Liste ist, war es eine Datei. –

+4

Es ist nicht der "C# FileSystemWatcher". Es ist der .NET FileSystemWatcher. Es funktioniert genauso gut mit allen .NET-Sprachen, nicht nur mit C#. –

+1

Es kommt mir vor, dass es funktioniert, wenn Sie zwei separate FSWs ausgeführt haben, die dasselbe Verzeichnis überwachen und sich nur in ihren 'NotifyFiter' Werten unterscheiden. –

Antwort

0

Sie können die FileSystemEventArgs.FullPath-Eigenschaft abfragen, um festzustellen, ob es sich um ein Verzeichnis oder eine Datei handelt.

Um zu überprüfen, ob es sich um eine Datei oder ein Verzeichnis handelt.

+2

Es wurde gelöscht, so dass diese Anrufe fehlschlagen würden, nicht? –

+0

@Steven Sudit: Sie müssten zuerst die Eigenschaft FileSystemEventArgs.ChangeType überprüfen. –

+1

'File.GetAttributes' löst eine' FileNotFoundException' für eine gelöschte Datei aus. –

33

Hier ist eine vereinfachte und korrigierte Version von Fletchers Lösung:

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. Ihre Lösung ist viel einfacher – fletcher

+0

Ich habe die Fehler raus, aber Sie haben die Idee, bevor ich es tat. –

+1

Diese Lösung berücksichtigt nicht, dass beide 'FileSystemWatcher' auf separaten Threads laufen. Wenn sich also im überwachten Verzeichnis viele Ereignisse befinden, kann die Reihenfolge der Ereignisse, die Sie in Ihrer App sehen, unterschiedlich sein - z. Sie können aufzeichnen, dass eine Datei in einem Verzeichnis erstellt wurde, das noch nicht existiert, gefolgt von einem Ereignis, das das Verzeichnis erstellt. – Paya

1

I vorübergehende Nutzung der „Path“ Funktion zunächst, aber später bei nicht lösche ich es von Directory.Exists beheben. jedoch, dass nicht behebt den Delete Fall

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


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

Ihre Frage macht nur Sinn, wenn es eine Datei auf dem gleichen Pfad und ein Verzeichnis mit dem gleichen Namen sein könnte. z.B. Wenn Sie Dateinamen ohne Erweiterung oder Verzeichnisse mit Erweiterung haben.

Wenn Ihre Verzeichnisse und Dateien den üblichen Konventionen folgen, nur auf das Vorhandensein einer Erweiterung im vollständigen Pfad (bool iSDirectory = Path.GetExtension(e.FullPath).Equals("");) überprüfen, was funktioniert, ob die Datei/Verzeichnis existiert oder nicht, weil die Methode nur den angegebenen Pfad analysiert und hat keinerlei Verbindung zu der Datei.

Wenn Sie mit den unkonventionellen Problemen, die ich eingangs erwähnt habe, umgehen müssen, können Sie überprüfen überprüfen, ob ein Verzeichnis oder eine Datei an diesem Ort existiert. Wenn dies nicht der Fall ist, behandeln Sie sie so, als ob beide gelöscht wären. Wenn einer von ihnen existiert, behandeln Sie den anderen so, als wäre er gelöscht worden.

Ihre Anfrage bedeutet, dass Sie irgendwo eine Liste der Dateien und Verzeichnisse führen. Wenn Sie diese Liste überprüfen, können Sie Ihre Entscheidung über die Handhabung treffen.

Ich denke, dass dieser Ansatz besser als die Lösung ist, die zwei Dateisystembeobachter verwendet, um den Unterschied zu unterscheiden.

Verwandte Themen