C# FileSystemWatcher。已在FTP上更改
我想在FTP目录上使用C# FileSystemWatcher。已在FTP上更改,c#,ftp,filesystemwatcher,C#,Ftp,Filesystemwatcher,我想在FTP目录上使用 我应该在属性FileSystemWatcher.Path中放置什么?您不能这样做。FileSystemWatcher监视文件系统,而不是FTP文件夹。因此,除非您具有FTP路径的文件系统访问权限(支持UNC路径),否则无法执行此操作。您不能使用或任何其他方式,因为FTP协议没有任何API来通知客户端远程目录中的更改 您所能做的就是定期迭代远程树并查找更改 如果您使用支持远程树递归列表的FTP客户机,那么它实际上相当容易实现。不幸的是,内置的.NET FTP客户端没有。例如
我应该在属性
FileSystemWatcher.Path中放置什么?您不能这样做。FileSystemWatcher监视文件系统,而不是FTP文件夹。因此,除非您具有FTP路径的文件系统访问权限(支持UNC路径),否则无法执行此操作。您不能使用或任何其他方式,因为FTP协议没有任何API来通知客户端远程目录中的更改
您所能做的就是定期迭代远程树并查找更改
如果您使用支持远程树递归列表的FTP客户机,那么它实际上相当容易实现。不幸的是,内置的.NET FTP客户端没有。例如,可以使用
见文章:
如果您不想使用第三方库,则必须遵守FtpWebRequest
的限制。有关如何使用FtpWebRequest
递归列出远程目录树的示例,请参阅我的答案。我想检测ftp目录中添加的文件,然后使用此文件您无法检测ftp目录中添加的文件。您应该实现类似于使用计时器轮询的功能,或者检查文件夹内容的功能。您可以为此使用System.Net.FtpClient。你想做的是不可能的。
// 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);
}
}
session.SynchronizeDirectories(
SynchronizationMode.Local, "/remote/path", @"C:\local\path", true).Check();