Я хочу использовать FileSystemWatcher.Changed
на каталог FTPFileSystemWatcher.Changed на FTP
Что я положил в собственности FileSystemWatcher.Path
?
Я хочу использовать FileSystemWatcher.Changed
на каталог FTPFileSystemWatcher.Changed на FTP
Что я положил в собственности FileSystemWatcher.Path
?
Вы не можете этого сделать. FileSystemWatcher наблюдает за файловой системой, а не с FTP-папкой. Поэтому, если у вас нет доступа к файловой системе на FTP-путь (поддерживаются пути UNC), вы не можете этого сделать.
Вы не можете использовать FileSystemWatcher
или любым другим способом, так как FTP-протокол не имеет API для уведомления клиента об изменениях в удаленном каталоге.
Все, что вы можете сделать, чтобы периодически перебирать удаленное дерево и находить изменения.
На самом деле это довольно просто реализовать, если вы используете FTP-клиент, который поддерживает рекурсивный список удаленного дерева. К сожалению, встроенный FTP-клиент .NET, FtpWebRequest
нет. Например, с помощью WinSCP .NET assembly вы можете использовать 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, а затем для работы с этим файлом –
Вы не можете обнаружить добавление файла в каталог ftp. Вы должны реализовать что-то вроде опроса с помощью таймера или что-то, чтобы проверить содержимое папки. Для этого вы можете использовать System.Net.FtpClient. То, что вы хотите сделать, невозможно. –