【问题标题】:How to monitor FTP incoming folder for newly uploaded files?如何监控 FTP 传入文件夹中新上传的文件?
【发布时间】:2025-05-13 06:10:01
【问题描述】:

换句话说,如何在我的机器上使用 IIS 支持的 FTP 服务器和 .NET 对新上传的文件进行一些自定义处理?

澄清 这是在托管 FTP 服务器的机器上运行的。就我而言,权限不是问题。

It seems I'd need to ask上传实体添加一个列表文件,在实际数据文件完全上传后发送。假设上传了一个实际的 xxx.data 文件,后面跟着 xxx.listing 文件,表示 xxx.data 文件上传完成。

最初这个问题是关于反应式扩展的。我希望有人能在 IIS 7.5 的 FTP 服务器和 Reactive Extensions 之间架起一座桥梁,这样我就可以专注于更高级别的实现细节。

【问题讨论】:

  • 有关使用System.IO.FileSystemWatcher的完整说明,请参阅此代码项目文章:codeproject.com/Articles/26528/…
  • 您的问题是“我的机器上的 FTP 服务器”,这意味着您可以访问它所服务的目录,并且可以使用 FileSystemWatcher 技术。很抱歉,我基于此向您提供了错误的信息——建议您明确说明它是一个非本地 FTP 服务器。我不知道有任何协议会更改可观察到的外部 FTP 服务器;你必须投票。
  • 还可以使用 HTTP 轮询双工 WCF 通道检查此 Pub/sub 示例 tomasz.janczuk.org/2009/07/…
  • 您是要扫描 FTP 目录,还是要扫描网络驱动器?
  • @casperOne 我正在寻找扫描我的机器上的 FTP 传入文件夹,给定管理员权限。

标签: c# .net iis system.reactive


【解决方案1】:

Rx 本身并不适合

当您想要查询事件(或及时的集合)并且想要组合复杂的过滤、连接和投影时,Rx 非常适合。

Rx 在观看 FTP 上传或文件系统更改方面完全没有做任何事情。或者任何事件源。它提供任何机制来生成这些类型的事件。

相反,它确实允许将各种不同的事件源(事件、异步操作、WMI 事件、生成的 observables 等)汇集到一个通用框架中。

您需要查看FileSystemWatcher 之类的内容,然后将其转换为可观察对象。

然后你可以用 Rx 做一些很棒的事情。真棒。

【讨论】:

  • 感谢您为我布置发展道路。
  • 不用担心。我喜欢使用 Rx。这很棒。值得学习来获得它的力量。祝你好运。
【解决方案2】:

我已经精简了 MSDN sample 以专注于文件创建,因为这是文件上传到 FTP 服务器时唯一感兴趣的事件。

必须安装 Reactive Extensions 才能让此代码示例在 Visual Studio 2012 中运行。

 class Program
 {
     static void Main()
     {
         // Create a FileSystemWatcher to watch the FTP incoming directory for creation of listing file

         using (var watcher = new FileSystemWatcher(@"C:\FTP-Data\Incoming", "*.lst"))
         {
             // Use the FromEvent operator to setup a subscription to the Created event.           
             //                                                                                    
             // The first lambda expression performs the conversion of Action<FileSystemEventArgs> 
             // to FileSystemEventHandler. The FileSystemEventHandler just calls the handler       
             // passing the FileSystemEventArgs.                                                   
             //                                                                                    
             // The other lambda expressions add and remove the FileSystemEventHandler to and from 
             // the event.                                                                         

             var fileCreationObservable = Observable.FromEvent<FileSystemEventHandler, FileSystemEventArgs>(
                                         UseOnlyTheSecondArgument,
                                         fsHandler => watcher.Created += fsHandler,
                                         fsHandler => watcher.Created -= fsHandler);

             fileCreationObservable.Subscribe(ActionWhenFileIsUploaded);

             watcher.EnableRaisingEvents = true;

             Console.WriteLine("Press ENTER to quit the program...\n");
             Console.ReadLine();
         }
     }

     private static void ActionWhenFileIsUploaded(FileSystemEventArgs args)
     {
         Console.WriteLine("{0} was created.", args.FullPath);

         // TODO
         // 1. Deduce original file name from the listing file info
         // 2. Consume the data file
         // 3. Remove listing file
     }

     private static FileSystemEventHandler UseOnlyTheSecondArgument(Action<FileSystemEventArgs> handler)
     {
         return (object sender, FileSystemEventArgs e) => handler(e);
     }
 }

我仍在研究将可观察的列表文件转换为可观察的实际数据文件的细节。敬请期待。

【讨论】:

    【解决方案3】:

    您需要扩展 FileWatcher 的功能,即检查您的文件是否已完全上传(或未上传),然后使用 cmets 中列出的 Rx 示例。

    或者..

    不直接查看 FTP 文件夹中的文件。而是运行 Windows 服务或某些应用程序将完全上传的文件复制处理文件夹,那么你确定只有没有部分文件。 (需要弄清楚如何。想知道文件在上传服务器期间是否被锁定)。这将单独应用程序中的观看和处理逻辑分开。(但使它更棘手。)。此外,在处理之后,您可以将文件移出处理文件夹,这样您就不会再次处理相同的文件(或者您可以使用其他一些逻辑。)

    【讨论】: