Вы не можете использовать FileSystemWatcher
или любой другой способ, потому что у протокола FTP нет API для уведомления клиента об изменениях в удаленном каталоге.
Все, что вы можетеДля этого периодически нужно выполнять итерации удаленного дерева и находить изменения.
На самом деле это довольно просто реализовать, если вы используете клиентскую библиотеку FTP, которая поддерживает рекурсивный список удаленного дерева.К сожалению, встроенный FTP-клиент .NET FtpWebRequest
этого не делает.Но, например, с WinSCP .NET сборка , вы можете использовать Session.EnumerateRemoteFiles
метод .
См. Статью Отслеживание изменений в SFTP / FTP-сервере:
// 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
в цикле.
while (true)
{
SynchronizationResult result =
session.SynchronizeDirectories(
SynchronizationMode.Local, "/remote/path", @"C:\local\path", true);
result.Check();
// You can inspect result.Downloads for a list for updated files
Console.WriteLine("Sleeping 10s...");
Thread.Sleep(10000);
}
Это обновит даже измененные файлы, а не только новые файлы.
Несмотря на использование WinSCP.NET сборка из веб-приложения может быть проблематичной.Если вы не хотите использовать стороннюю библиотеку, вам нужно ограничиться FtpWebRequest
.Пример рекурсивного вывода списка удаленных каталогов с помощью FtpWebRequest
см. В моем ответе на Список имен файлов в каталоге FTP и его подкаталогах .
Вы редактировалиВаш вопрос, чтобы сказать, что у вас есть проблемы с производительностью с решениями, которые я предложил.Хотя вы уже задали новый вопрос, который охватывает это:
Получить сведения о файле FTP на основе даты и времени в C #