C#在SAN中的目录之间移动文件

时间:2015-07-23 00:33:57

标签: c# .net visual-studio san

我正在开发一个winform应用程序,用于在SAN中的目录之间移动文件。该应用程序搜索SAN目录中超过200,000个文件(每个目录)的目录中的文件列表,然后将找到的文件移动到另一个目录。

例如,我有这条道路:

\ san \ xxx \ yyy \ zzz

我在\ zzz中执行搜索,然后将文件移动到\ yyy,但是当我移动文件时,另一个应用程序正在向xxx,yyy和zzz目录中插入更多文件。

我不想影响对使用这些目录的其他应用程序的访问或性能。

文件的完整性也是一个大问题,因为当应用程序将文件移动到\ yyy目录时,另一个应用程序会使用这些文件。

所有这些步骤应该并行运行。

我可以使用哪些方法来实现这一目标? 我该如何处理并发?

提前致谢。

2 个答案:

答案 0 :(得分:0)

使用已发布的.net源,可以看到移动文件操作的工作原理Here。现在,如果您按照逻辑进行操作,则会调用KERNEL32。此状态的MSDN documentation

  

要将此操作作为事务处理操作,请使用MoveFileTransacted函数。

根据我的说法,移动方法是移动文件的安全/好方法。

搜索大量文件总是需要时间。如果你需要提高这个操作的速度,我建议你不要试图这样做。例如,我已经看到为字母和日期生成缓存桶。使用某种缓存系统,您可以更快地搜索文件,例如通过向缓存桶询问以“a”开头的文件,例如“以这些文件开头的文件,或这些日期之间的文件”等。

答案 1 :(得分:0)

据推测,这些文件被某些东西使用。出于对话的目的,我们假设它们已在SQL数据库中编入索引。

TABLE: Files

File ID        Filename
-------------- ----------------------------
1              \\a\b\aaaaa.bin
2              \\a\b\bbbbb.bin

要将它们移至\\a\c\而不影响访问权限,您可以执行以下操作:

  1. 将文件从\\a\b\aaaa.bin复制到\\a\c\aaaa.bin
  2. 更新数据库以指向\\a\c\aaaa.bin
  3. 关闭\\a\b\aaaa.bin的所有未结会话后,删除旧文件
  4. 如果文件在同一卷上,您也可以使用硬链接而不是副本。