programas - freemove windows 10
¿Cómo puedo controlar un directorio de Windows para ver los cambios? (7)
Cuando se realiza un cambio dentro de un directorio en un sistema Windows, necesito que se notifique un programa inmediatamente del cambio.
¿Hay alguna forma de ejecutar un programa cuando ocurre un cambio?
No soy un programador de C / C ++ / .NET, así que si pudiera configurar algo para que el cambio pudiera desencadenar un archivo por lotes, sería ideal.
No hay utilidad o programa que viene con Windows para hacerlo. Alguna programación requerida.
Como se señaló en otra respuesta, FileSystemWatcher
de .NET es el enfoque más fácil.
La API nativa ReadDirectoryChangesW es bastante difícil de usar (requiere una comprensión de los puertos de finalización).
Si quieres algo no programático prueba GiPo @ FileUtilities ... pero en ese caso la pregunta no debería estar aquí.
Use un FileSystemWatcher
FileSystemWatcher es la respuesta correcta, excepto que solía ser que FileSystemWatcher solo funcionaba para unos ''pocos'' cambios a la vez. Eso fue debido a un buffer del sistema operativo. En la práctica, siempre que se copian muchos archivos pequeños, se sobrepasa el búfer que contiene los nombres de archivo de los archivos. Este búfer no es realmente la manera correcta de realizar un seguimiento de los cambios recientes, ya que el sistema operativo tendría que dejar de escribir cuando el búfer está lleno para evitar excesos.
En cambio, Microsoft proporciona otras funciones (EDITAR: como diarios de cambios) para capturar realmente todos los cambios. Que esencialmente son las instalaciones que usan los sistemas de respaldo, y son complejas en los eventos que se registran. Y también están mal documentados.
Una prueba simple es generar una gran cantidad de archivos pequeños y ver si FileSystemWatcher informa sobre ellos. Si tiene un problema, le sugiero que evite todo el problema y escanee el sistema de archivos en busca de cambios en un intervalo de tiempo determinado.
Esta pregunta me ayudó mucho a comprender el sistema File Watcher. Implementé ReadDirectoryChangesW para supervisar un directorio y todos sus subdirectorios y obtener la información sobre el cambio en esos directorios.
He escrito una publicación de blog sobre el mismo tema, y me gustaría compartirlo para que pueda ayudar a alguien que aterrice aquí por el mismo problema.
Win32 File Watcher Api para supervisar los cambios de directorio .
Entré en esta página mientras buscaba una forma de supervisar la actividad del sistema de archivos. Tomé la publicación de Refracted Paladin y el FileSystemWatcher que compartió y escribí una implementación de C # de trabajo rápida y sucia:
using System;
using System.IO;
namespace Folderwatch
{
class Program
{
static void Main(string[] args)
{
//Based on http://.com/questions/760904/how-can-i-monitor-a-windows-directory-for-changes/27512511#27512511
//and http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx
string pathToFolder = string.Empty;
string filterPath = string.Empty;
const string USAGE = "USAGE: Folderwatch.exe PATH FILTER /n/n e.g.:/n/n Folderwatch.exe c://windows *.dll";
try
{
pathToFolder = args[0];
}
catch (Exception)
{
Console.WriteLine("Invalid path!");
Console.WriteLine(USAGE);
return;
}
try
{
filterPath = args[1];
}
catch (Exception)
{
Console.WriteLine("Invalid filter!");
Console.WriteLine(USAGE);
return;
}
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = pathToFolder;
watcher.Filter = filterPath;
watcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime |
NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess |
NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size;
// Add event handlers.
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
// Begin watching.
watcher.EnableRaisingEvents = true;
// Wait for the user to quit the program.
Console.WriteLine("Monitoring File System Activity on {0}.", pathToFolder);
Console.WriteLine("Press /'q/' to quit the sample.");
while (Console.Read() != ''q'') ;
}
// Define the event handlers.
private static void OnChanged(object source, FileSystemEventArgs e)
{
// Specify what is done when a file is changed, created, or deleted.
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
}
private static void OnRenamed(object source, RenamedEventArgs e)
{
// Specify what is done when a file is renamed.
Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
}
}
}
Para usar esto, descarga Visual Studio (Express lo hará). Cree una nueva aplicación de consola C # llamada Folderwatch y copie y pegue mi código en su Program.cs.
Como alternativa, puede usar Sys Internals Process Monitor: Process Monitor Puede monitorear el sistema de archivos y mucho más.
Use un FileSystemWatcher como el siguiente para crear un evento WatcherCreated (). Lo usé para crear un servicio de Windows que mira una carpeta de red y luego envía un correo electrónico a un grupo específico al recibir nuevos archivos.
// Declare a new FILESYSTEMWATCHER
protected FileSystemWatcher watcher;
string pathToFolder = @"YourDesired Path Here";
// Initialize the New FILESYSTEMWATCHER
watcher = new FileSystemWatcher {Path = pathToFolder, IncludeSubdirectories = true, Filter = "*.*"};
watcher.EnableRaisingEvents = true;
watcher.Created += new FileSystemEventHandler(WatcherCreated);
void WatcherCreated(object source , FileSystemEventArgs e)
{
//Code goes here for when a new file is detected
}