我想在FTP目录上使用{{3}}
我在属性FileSystemWatcher.Path
中添加了什么?
答案 0 :(得分:1)
你不能这样做。 FileSystemWatcher监视文件系统,而不是FTP文件夹。因此,除非您有文件系统访问FTP路径(支持UNC路径),否则您无法执行此操作。
答案 1 :(得分:0)
您不能使用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();
如果您不想使用第三方库,则必须考虑FtpWebRequest
的限制。有关如何使用FtpWebRequest
递归列出远程目录树的示例,请参阅我对C# Download all files and subdirectories through FTP的回答。