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

Rob*_*ett 10 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

Mar*_*ell 3

FileSystemWatcher 是一种尽早了解文件删除情况的实用方法,但有很多边缘情况可能会导致错过事件。您仍然需要定期扫描才能确定。

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

另外:注意“不是这里发明的”...有许多现有的实用程序可以监视文件夹;BizTalk(一个过大的)例子。我并不是说“不要自己做”,但至少考虑一下预先准备的选项。