3

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

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

看来我需要要求上传实体添加在实际数据文件完全上传后发送的列表文件。假设上传了一个实际的 xxx.data 文件,后面跟着 xxx.listing 文件,表示 xxx.data 文件上传完成。

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

4

3 回答 3

2

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

必须为此代码示例安装响应式扩展才能在 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);
     }
 }

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

于 2012-11-24T16:40:24.860 回答
2

Rx本身并不适合。

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

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

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

你需要看看类似的东西FileSystemWatcher,然后把它变成一个可观察的。

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

于 2012-11-24T10:13:44.790 回答
0

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

或者..

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

于 2012-11-24T16:14:00.013 回答