换句话说,如何使用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的桥梁,因此我可以专注于更高级别的实现细节。
答案 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服务或某些应用程序将完全上传的文件复制到处理文件夹,然后您确定只有没有部分文件。 (将需要弄清楚如何。想知道文件是否在上传服务器期间被锁定)。这将在单独的应用程序中分离观察和处理逻辑。(但使它更棘手。)。处理完毕后,您也可以将文件移出处理文件夹,这样就不会再次处理同一个文件(或者您可以使用其他逻辑。)