【发布时间】:2016-06-07 19:38:58
【问题描述】:
我想在 FTP 目录上使用FileSystemWatcher.Changed
我在属性FileSystemWatcher.Path 中放了什么?
【问题讨论】:
标签: c# ftp filesystemwatcher
我想在 FTP 目录上使用FileSystemWatcher.Changed
我在属性FileSystemWatcher.Path 中放了什么?
【问题讨论】:
标签: c# ftp filesystemwatcher
你不能这样做。 FileSystemWatcher 监视文件系统,而不是 FTP 文件夹。因此,除非您具有对 FTP 路径的文件系统访问权限(支持 UNC 路径),否则您无法执行此操作。
【讨论】:
您不能使用FileSystemWatcher 或任何其他方式,因为 FTP 协议没有任何 API 来通知客户端远程目录中的更改。
您所能做的就是定期迭代远程树并查找更改。
如果您使用支持远程树递归列表的 FTP 客户端,它实际上很容易实现。不幸的是,内置的 .NET FTP 客户端 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 的回答。
【讨论】: