C# FileSystemWatcher。已在FTP上更改

C# FileSystemWatcher。已在FTP上更改,c#,ftp,filesystemwatcher,C#,Ftp,Filesystemwatcher,我想在FTP目录上使用 我应该在属性FileSystemWatcher.Path中放置什么?您不能这样做。FileSystemWatcher监视文件系统,而不是FTP文件夹。因此,除非您具有FTP路径的文件系统访问权限(支持UNC路径),否则无法执行此操作。您不能使用或任何其他方式,因为FTP协议没有任何API来通知客户端远程目录中的更改 您所能做的就是定期迭代远程树并查找更改 如果您使用支持远程树递归列表的FTP客户机,那么它实际上相当容易实现。不幸的是,内置的.NET FTP客户端没有。例如

我想在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();