2010-07-26 11 views
27

¿Hay alguna forma de determinar con el FSW si se ha eliminado un archivo o un directorio?.NET filesystemwatcher - ¿era un archivo o un directorio?

+0

No estoy seguro de que pueda, francamente. La solución obvia sería recurrir al inicio para crear una lista de directorios. Si no está en esa lista, es un archivo. –

+4

No es el "C# FileSystemWatcher". Es .NET FileSystemWatcher. Funciona igual de bien con todos los lenguajes .NET, no solo con C#. –

+1

Se me ocurre que podría funcionar si ejecutó dos FSW diferentes monitoreando el mismo directorio y difiriendo solo en sus valores 'NotifyFiter'. –

Respuesta

0

Puede consultar la propiedad FileSystemEventArgs.FullPath para saber si es un directorio o un archivo.

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

Para comprobar si se trata de un archivo o directorio.

+2

Se eliminó, por lo que estas llamadas fallarían, ¿no? –

+0

@Steven Sudit: primero debe verificar la propiedad FileSystemEventArgs.ChangeType. –

+1

'File.GetAttributes' arroja una' FileNotFoundException' para un archivo eliminado. –

33

Aquí hay una versión simplificada y corregida de la solución de 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

+1. Su solución es mucho más simple – fletcher

+0

Obtuve los errores, pero se le ocurrió la idea antes que yo. –

+1

Esta solución no tiene en cuenta que ambos 'FileSystemWatcher's se ejecutan en hilos separados. Por lo tanto, si hay muchos eventos en el directorio mirado, el orden de los eventos que ve en su aplicación puede ser diferente, es decir. puede registrar que un archivo fue creado en un directorio que aún no existe, seguido de un evento que crea dicho directorio. – Paya

1

que el uso temporal de la función "Camino" al principio, pero más tarde en caso de no borrar lo fijo por Directory.Exists. Sin embargo esto no soluciona el caso Eliminar

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


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

Su pregunta sólo tiene sentido si podría haber un archivo y un directorio con el mismo nombre en el mismo camino. p.ej. Si tiene nombres de archivos sin extensión o directorios con extensión.

Si sus directorios y archivos siguen las convenciones habituales, solo comprueba la presencia de una extensión en la ruta completa (bool iSDirectory = Path.GetExtension(e.FullPath).Equals("");), que funciona si el archivo/directorio existe o no, porque el método simplemente analiza la ruta dada y no tiene conexión con el archivo en absoluto.

Si usted tiene que hacer frente a los problemas no convencionales que he mencionado al principio, que podría comprobar si existe un directorio o un archivo en esa ubicación. Si ninguno lo hace, los trata como si ambos fueran eliminados. Si uno de ellos existe, tratas al otro como si se hubiera eliminado.

Su consulta implica que mantiene una lista de los archivos y directorios en alguna parte, por lo que, al comparar con esa lista, puede tomar su decisión sobre el manejo.

Creo que este enfoque es mejor que la solución dada que usa dos monitores del sistema de archivos para diferenciar.

Cuestiones relacionadas