FileSystemWatcher.Changed在FTP上

时间:2016-06-07 19:38:58

标签: c# ftp filesystemwatcher

我想在FTP目录上使用{{3}}

我在属性FileSystemWatcher.Path中添加了什么?

2 个答案:

答案 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的回答。