2009-02-26 68 views
9

好的,我手上有一个有趣的问题。这里有一些背景:观看上传文件夹的最佳做法?

我正在编写一个媒体库服务实现,它将向前端Flash播放器提供URL。客户希望能够通过将带有一些元数据的文件上传到FTP文件夹中来将内容推送到服务中 - 我已经控制了元数据模式。观看这个文件夹的服务将拾取任何新文件,将它们复制到“内容”文件夹中,然后将元数据和网址按内容服务中的内容推送到数据库中。

内容服务不是问题,完成。看一个FTP文件夹是。

我目前的实现使用FileSystemWatcher对象和一个用于xml文件的过滤器。

每个内容项目可能有多个文件,例如高,中,低质量的视频。

我打算强制按进程或工具将内容组织到自己的文件夹中,只是为了简洁起见,但这不是真正的问题。

的XML文件看起来有点像这样:

<media> 
    <meta type="video"> 
    <name>The Name Displayed</name> 
    <heading>The title of the video</heading> 
    <description> 
     A lengthy description about the video.. 
    </description> 
    <length>00:00:19</length> 
</meta> 
<files> 
    <video file="somevideo.flv" quality="low"/> 
    <video file="somevideo.flv" quality="medium"/> 
    <video file="somevideo.flv" quality="high"/> 
</files> 
</media> 

因此,当一个新的文件中创建FileSystemWatcher.Created事件触发。我有一个独立的线程运行来处理与主服务进程共享一个队列的内容(不要担心它使用生产者消费者模式,详细信息如下:http://msdn.microsoft.com/en-us/library/yy12yx1f.aspx)。

这一切都正常,但现在我遇到了左边和右边的情况!

我已经考虑到视频上传需要更长的时间,因此处理器会尝试获得排他锁定,如果失败,它会将项目移动到队列后面并移至下一个项目。

  • 如果服务崩溃或者那里已经存在文件,会发生什么?所以我写了一个方法来排队现有的文件。
  • 如果在排队现有文件时文件正在上载,该怎么办?希望它能处理这个问题?我应该定期重新扫描目录,看看我是否错过了任何东西?

任何人都可以推荐这种情况下的最佳做法吗?文件系统监视器是一个好主意,还是应该定期扫描文件夹?

编辑:只是想给你一些规模的想法。我们总共谈到10个1000个项目。可能上传大块。

回答

3

FileSystemWatcher是获取文件丢失的早期可见性的实用方法,但存在很多可能导致错过事件的边缘情况。你仍然需要定期扫描。

为了避免尽可能多的互斥问题;客户端可以上传为foo.xml.upload,然后重命名为foo.xml吗?这将避免冗长的锁定文件...(你只是忽略了.upload文件)。

另外:要小心“没有发明在这里”......有很多现有的实用程序,监控文件夹; BizTalk for(一个矫枉过正)的例子。我不是说“不要自己动手”,而是至少考虑预先选择的罐装食品。

+0

我会看看第三方解决方案。我认为这里没有发明可能会涉及它。我已经被推荐使用Fluent Nhibernate,并被命令使用Linq to Sql代替。必须获得任何第三方的认可 - 需要一个年龄。 – 2009-02-26 10:37:20

+0

@ RobStevenson-Leggett您是否找到第三方解决方案?还是你最终滚动自己的? – phuzi 2015-05-18 19:53:16

0

您可能希望运行一个Web服务,以使上传者可以在上传完成时进行ping操作。只是一个网址会很好,就像“http://www.bigtimecompany.com/ftpuploadcomplete.php”一样,被调用后,会启动任何程序检查ftp文件夹。

1

观看文件时遇到的一个常见错误创建是您可以在上传完成之前收到您的事件,因此您最终会处理一个不完整的文件。

当然,您可以检查,因为不完整的文件的xml格式不正确。但更好的解决方案是让上传器写入临时文件,完成上载后,将文件重命名为* .xml。

至于FileSystemWatcher本身,以及...当我在使用网络共享时(delete事件从未被解雇),我开始不信任它。所以我写了我自己的'观察者',它与FSW具有类似的接口,但只是轮询文件创建/删除/更改的目录。不如FSW那么优雅,但更可靠。