繁体   English   中英

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

[英]How to monitor FTP incoming folder for newly uploaded files?

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

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

看来我需要让上传实体添加一个在完全上传实际数据文件后发送的列表文件。 想象一下,上传了一个实际的xxx.data文件,然后是xxx.listing文件,表示xxx.data文件上传完成。

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

Rx 本身并不适合。

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

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

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

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

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

我已经缩减了MSDN示例以专注于文件创建,因为它是文件上传到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);
     }
 }

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

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

要么..

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM