【问题标题】:FileSystemWatcher.Changed on FTPFileSystemWatcher.已在 FTP 上更改
【发布时间】:2016-06-07 19:38:58
【问题描述】:

我想在 FTP 目录上使用FileSystemWatcher.Changed

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

【问题讨论】:

    标签: c# ftp filesystemwatcher


    【解决方案1】:

    你不能这样做。 FileSystemWatcher 监视文件系统,而不是 FTP 文件夹。因此,除非您具有对 FTP 路径的文件系统访问权限(支持 UNC 路径),否则您无法执行此操作。

    【讨论】:

    • 我想检测目录ftp中添加的文件,然后使用这个文件
    • 您无法检测到在 ftp 目录中添加了文件。您应该实现类似使用计时器轮询或检查文件夹内容的东西。您可以为此使用 System.Net.FtpClient。你想做的事是不可能的。
    【解决方案2】:

    您不能使用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 的回答。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多