观看上传文件夹的最佳做法?

时间:2009-02-26 09:52:07

标签: c# multithreading

好的,我的手上有一个有趣的问题。这里有一些背景知识:

我正在编写一个媒体库服务实现,它将为前端Flash播放器提供URL。客户希望能够通过将带有一些元数据的文件上传到FTP文件夹来将内容推送到服务中 - 我可以控制元数据模式。观看此文件夹的服务将获取所有新文件,将其复制到“内容”文件夹中,然后将元数据和URL推送到内容服务中的内容并进入数据库。

内容服务不是问题,已完成。观看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)。

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

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

  • 如果服务崩溃或者那里已有文件,会发生什么?所以我写了一个排队现有文件的方法。
  • 如果文件在排队现有文件时上传了怎么办?希望它会处理这个?我是否应定期重新扫描目录以查看是否遗漏了任何内容?

有人可以为这种情况推荐最佳做法吗? filesystemwatcher是个好主意还是服务只是定期扫描文件夹?

编辑:只是为了让您了解规模。我们总共谈论了1000件商品中的10件。可能以大块上传。

3 个答案:

答案 0 :(得分:3)

FileSystemWatcher是一种获得文件丢弃的早期可见性的实用方法,但是有很多边缘情况可能导致错过事件。你仍然需要定期扫描才能确定。

避免互联网问题;客户端可以上传为foo.xml.upload,然后在那里重命名为foo.xml吗?这样可以避免冗长的锁定文件......(你只需忽略.upload文件)。

另外:注意“这里没有发明”......有许多现有的实用工具可以监控文件夹; BizTalk for(一个矫枉过正)的例子。我不是说“不要自己做”,而是至少考虑预先制作的选项。

答案 1 :(得分:1)

观看文件创建时常见的缺陷是,您可能会在上传完成之前收到您的活动,因此您最终会处理不完整的文件。

当然你可以检查一下,因为不完整文件的xml不能很好地形成。但更好的解决方案IMO是让上传者写入临时文件,完成上传后,将文件重命名为* .xml。

对于FileSystemWatcher本身,嗯......当它在网络共享上使用时,我已经开始不信任它(delete事件从未被触发过)。所以我编写了自己的“观察者”,它具有与FSW类似的界面,但只是轮询目录以进行文件创建/删除/更改。不像FSW那么优雅,但更可靠。

答案 2 :(得分:0)

您可能希望运行网络服务,因为上传程序可以在上传完成时ping通。只需一个网址即可,例如“http://www.bigtimecompany.com/ftpuploadcomplete.php”,在被调用时会激活任何程序检查ftp文件夹。