如何监控新上传文件的FTP传入文件夹?

时间:2012-11-23 21:59:25

标签: c# .net iis system.reactive

换句话说,如何使用IIS支持的FTP服务器和.NET启动我的计算机上FTP服务器的新上传文件的自定义处理?

澄清 这是在托管FTP服务器的计算机上运行。在我的情况下,权限不是问题。

It seems I'd need to ask上传实体添加在完全上传实际数据文件后发送的列表文件。想象一下,上传了一个实际的xxx.data文件,然后是xxx.listing文件,表示完成xxx.data文件上传。

最初这个问题是关于Reactive Extensions。我希望有人拥有从IIS 7.5的FTP服务器到Reactive Extensions的桥梁,因此我可以专注于更高级别的实现细节。

3 个答案:

答案 0 :(得分:2)

Rx 本身并不适合

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

对于观看FTP上传或文件系统更改,Rx绝对没有任何作用。或者任何事件来源真的。 提供生成这些类型事件的任何机制。

相反,它确实允许一种方法将各种不同的事件源 - 事件,异步操作,WMI事件,生成的可观察对象等 - 集合到一个通用框架中。

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

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

答案 1 :(得分: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);
     }
 }

我仍在研究将列表文件的observable转换为可观察的实际数据文件的细节。请继续关注。

答案 2 :(得分:0)

您需要扩展FileWatcher的功能,即检查您的文件是否已完全上传(或不是),然后使用评论中列出的Rx样本。

或..

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