Вы не можете использовать FileSystemWatcher
или любым другим способом, поскольку в протоколе FTP нет API для уведомления клиента об изменениях в удаленной директории.
Все, что вы можете сделать - это периодически перебирать удаленное дерево и находить изменения.
На самом деле это довольно просто реализовать, если вы используете FTP-клиентскую библиотеку, которая поддерживает рекурсивный список удаленного дерева. К сожалению, встроенный FTP-клиент .NET, FtpWebRequest
нет. Но, например, с WinSCP .NET assembly версии 5.9 (или новее), вы можете использовать Session.EnumerateRemoteFiles
method.
Смотрите статью 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);
}
}
(я автор WinSCP)
Хотя, если вы на самом деле хотите, чтобы просто загрузить изменения, это способ проще , Просто используйте Session.SynchronizeDirectories
в цикле.
session.SynchronizeDirectories(
SynchronizationMode.Local, "/remote/path", @"C:\local\path", true).Check();
Если вы не хотите использовать 3rd библиотеку партии, вы должны делать с ограничениями FtpWebRequest
. Например, как рекурсивно перечислить дерево удаленных каталогов с помощью FtpWebRequest
, см. Мой ответ на C# Download all files and subdirectories through FTP.
Вы собираетесь использовать подход типа опроса. Вы должны периодически проверять сайт ftp, чтобы проверить, есть ли новый файл. – jersoft