3

つまり、IISでサポートされているFTPサーバーと.NETを使用して、自分のマシンのFTPサーバーに新しくアップロードされたファイルのカスタム処理を開始するにはどうすればよいですか?

明確化 これは、FTPサーバーをホストするマシンで実行することです。私の場合、権限は問題ではありません。

実際のデータファイルが完全にアップロードされた後に送信されるリストファイルを追加するようにアップロードエンティティに依頼する必要があるようです。実際のxxx.dataファイルがアップロードされ、その後にxxx.dataファイルのアップロードの完了を示すxxx.listingファイルが続くと想像してください。

もともとこの質問はリアクティブエクステンションについて話していました。誰かがIIS7.5のFTPサーバーからReactiveExtensionsへのブリッジを持っていることを望んでいたので、より高いレベルの実装の詳細に集中することができます。

4

3 に答える 3

2

ファイルがFTPサーバーにアップロードされるときに関心のある唯一のイベントであるため、 MSDNサンプルをスリム化してファイルの作成に焦点を合わせました。

Visual Studio 2012で機能するには、このコードサンプルのReactiveExtensionsをインストールする必要があります。

 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イベント、生成されたオブザーバブルなど、あらゆる種類の異なるイベントソースを共通のフレームワークにまとめる方法が可能になります。

あなたはのようなものを見てFileSystemWatcher、それからこれを観察可能なものに変える必要があります。

次に、Rxでいくつかの素晴らしいことを行うことができます。本当に素晴らしい。

于 2012-11-24T10:13:44.790 に答える
0

FileWatcherの機能を拡張する必要があります。つまり、ファイルが完全にアップロードされたかどうかを確認してから、コメントにリストされているRxサンプルを使用する必要があります。

または..

FTPフォルダー内のファイルを直接監視するのではなく、Windowsサービスまたはアプリを実行して、完全にアップロードされたファイルを処理フォルダーにコピーします。そうすれば、部分的なファイルだけが存在することを確認できます。(方法を理解する必要があります。サーバーをアップロードしている間、ファイルがロックされているかどうか疑問に思います)。これにより、監視と処理のロジックが別々のアプリに分離されます(ただし、注意が必要になります)。また、処理後、同じファイルを再度処理しないように、ファイルを処理フォルダーから移動できます(または他のロジックを使用できます)。

于 2012-11-24T16:14:00.013 に答える