una - obtener informacion de un archivo c#
¿Cómo establecer filtro para FileSystemWatcher para múltiples tipos de archivos? (5)
En todas partes encuentro estas dos líneas de código usadas para establecer el filtro para el observador del sistema de archivos en las muestras proporcionadas.
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Filter = "*.txt";
//or
watcher.Filter = "*.*";
Pero quiero que mi monitor monitoree más tipos de archivos, pero no todos. Cómo puedo conseguir esto:
//watcher.Filter = "*.txt" | "*.doc" | "*.docx" | "*.xls" | "*.xlsx";
Intenté estos:
watcher.Filter = "*.txt|*.doc|*.docx|*.xls|*.xlsx";
// and
watcher.Filter = "*.txt;*.doc;*.docx;*.xls;*.xlsx*";
Ambos no funcionaron. Esto es solo básico pero lo extraño. Gracias..
Hay una solución.
La idea es observar todas las extensiones y luego, en el evento OnChange, filtrar a las extensiones deseadas:
FileSystemWatcher objWatcher = new FileSystemWatcher();
objWatcher.Filter = "*.*";
objWatcher.Changed += new FileSystemEventHandler(OnChanged);
private static void OnChanged(object source, FileSystemEventArgs e)
{
// get the file''s extension
string strFileExt = getFileExt(e.FullPath);
// filter file types
if (Regex.IsMatch(strFileExt, @"/.txt)|/.doc", RegexOptions.IgnoreCase))
{
Console.WriteLine("watched file type changed.");
}
}
No puedes hacer eso. La propiedad Filter
solo admite un filtro a la vez. De la documentation :
El uso de filtros múltiples como
*.txt|*.doc
no es compatible.
Necesita crear un FileSystemWatcher
para cada tipo de archivo. A continuación, puede vincularlos todos al mismo conjunto de FileSystemEventHandler
:
string[] filters = { "*.txt", "*.doc", "*.docx", "*.xls", "*.xlsx" };
List<FileSystemWatcher> watchers = new List<FileSystemWatcher>();
foreach(string f in filters)
{
FileSystemWatcher w = new FileSystemWatcher();
w.Filter = f;
w.Changed += MyChangedHandler;
watchers.Add(w);
}
Para ampliar la solución de Mrchief y jdhurst:
private string[] extensions = { ".css", ".less", ".cshtml", ".js" };
private void WatcherOnChanged(object sender, FileSystemEventArgs fileSystemEventArgs)
{
var ext = (Path.GetExtension(fileSystemEventArgs.FullPath) ?? string.Empty).ToLower();
if (extensions.Any(ext.Equals))
{
// Do your magic here
}
}
Esto elimina el corrector de expresiones regulares (que en mi opinión es demasiado alto) y utiliza Linq para nuestra ventaja. :)
Editado: se agregó una comprobación nula para evitar posibles NullReferenceException.
También puede filtrar utilizando FileInfo comparando con la cadena de la extensión que está buscando.
Por ejemplo, el controlador para un evento de cambio de archivo podría verse así:
void File_Changed(object sender, FileSystemEventArgs e)
{
FileInfo f = new FileInfo(e.FullPath);
if (f.Extension.Equals(".jpg") || f.Extension.Equals(".png"))
{
//Logic to do whatever it is you''re trying to do goes here
}
}
Un vistazo rápido en el reflector muestra que el filtrado se realiza en el código .Net después de que la API de Windows haya informado del cambio del sistema de archivos.
Por lo tanto, sugeriría que el enfoque de registrar varios observadores es ineficiente ya que está cargando más API provocando múltiples devoluciones de llamada y solo uno de los filtros coincidirá. Es mucho mejor simplemente registrar un solo observador y filtrar los resultados usted mismo.