No puede usar el FileSystemWatcher
o de otra forma, porque el protocolo FTP no tiene ninguna API para notificar a un cliente sobre cambios en el directorio remoto.
Todo lo que puede hacer es iterar periódicamente el árbol remoto y buscar cambios.
En realidad es bastante fácil de implementar, si utiliza una biblioteca cliente FTP que admita la enumeración recursiva de un árbol remoto. Desafortunadamente, el cliente de FTP .NET incorporado, el FtpWebRequest
no. Pero, por ejemplo, con WinSCP .NET assembly versión 5.9 (o más reciente), puede usar el Session.EnumerateRemoteFiles
method.
vea el artículo Watching for changes in SFTP/FTP server:
// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Ftp,
HostName = "example.com",
UserName = "user",
Password = "password",
};
using (Session session = new Session())
{
// Connect
session.Open(sessionOptions);
List<string> prevFiles = null;
while (true)
{
// Collect file list
List<string> files =
session.EnumerateRemoteFiles(
"/remote/path", "*.*", EnumerationOptions.AllDirectories)
.Select(fileInfo => fileInfo.FullName)
.ToList();
if (prevFiles == null)
{
// In the first round, just print number of files found
Console.WriteLine("Found {0} files", files.Count);
}
else
{
// Then look for differences against the previous list
IEnumerable<string> added = files.Except(prevFiles);
if (added.Any())
{
Console.WriteLine("Added files:");
foreach (string path in added)
{
Console.WriteLine(path);
}
}
IEnumerable<string> removed = prevFiles.Except(files);
if (removed.Any())
{
Console.WriteLine("Removed files:");
foreach (string path in removed)
{
Console.WriteLine(path);
}
}
}
prevFiles = files;
Console.WriteLine("Sleeping 10s...");
Thread.Sleep(10000);
}
}
(yo soy el autor de WinSCP)
embargo, si usted quiere realmente sólo tiene que descargar los cambios, que es una manera más fácil . Simplemente use el Session.SynchronizeDirectories
en el ciclo.
session.SynchronizeDirectories(
SynchronizationMode.Local, "/remote/path", @"C:\local\path", true).Check();
Si no desea utilizar una biblioteca tercera parte, que tienen que ver con las limitaciones de la FtpWebRequest
. Para ver un ejemplo de cómo enumerar recursivamente un árbol de directorio remoto con el FtpWebRequest
, consulte mi respuesta al C# Download all files and subdirectories through FTP.
Va a utilizar el enfoque de tipo de sondeo. Debe verificar el sitio ftp periódicamente para verificar si hay un nuevo archivo. – jersoft