iis 如何监控FTP传入文件夹中是否有新上传的文件?

zyfwsgd6  于 2022-11-12  发布在  其他
关注(0)|答案(4)|浏览(110)

换句话说,我如何在我的机器上启动一些自定义处理,将新上载的文件处理到具有IIS支持的FTP服务器和.NET的FTP服务器上?

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

It seems I'd need to ask上载实体添加列表文件,该列表文件在实际数据文件完全上载之后发送。假设存在上载的实际xxx.data文件,随后是xxx.listing文件,其表示xxx.data文件上载完成。
最初这个问题是关于React式扩展的,我希望有人能从IIS 7.5的FTP服务器连接到React式扩展,这样我就可以专注于更高级别的实现细节。

nszi6y05

nszi6y051#

Rx本身并不合适。
当您想查询事件(或时间上的集合),并想组成复杂的过滤、连接和投影时,Rx是一个很好的选择。
Rx完全不关注FTP上传或文件系统的变化。或者任何事件源。它
不**提供任何机制来生成这些类型的事件。
相反,它确实允许一种方法将所有种类的不同事件源-事件、异步操作、WMI事件、生成的可观察性等-合并到一个公共框架中。
你需要看FileSystemWatcher这样的东西,然后把它变成一个可观察的。
然后你可以用Rx做一些很棒的事情。真的很棒。

gfttwv5a

gfttwv5a2#

我已经精简了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);
     }
 }

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

g6ll5ycj

g6ll5ycj3#

要知道一个新文件是完整的,一个常见的模式是客户端将文件上传到TEMP目录,然后执行FTP移动命令。如果源目录和目标目录在同一个分区上,则移动(或重命名)是原子的。

z9zf31ra

z9zf31ra4#

您将需要扩展FileWatcher的功能,即检查您的文件是否已完全上传(或未上传),然后使用注解中列出的Rx示例。
或者...
不要直接查看FTP文件夹中的文件..而是运行Windows服务或一些应用程序将完全上传的文件 * 复制 * 到处理文件夹,那么您可以确定只有不存在部分文件。(将需要弄清楚如何。想知道一个文件是否在上传服务器的期间被锁定)。这将观看和处理逻辑分离在单独的应用程序中。(但这会使它变得更棘手。)此外,在处理后,您可以将文件移出处理文件夹,这样您就不会再次处理同一个文件(或者您可以使用一些其他逻辑)。

相关问题