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

本文关键字:之间 移动 文件 SAN | 更新日期: 2023-09-27 18:04:03

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

例如我有这样的路径:

'圣' xxx ' yyy '打鼾声

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

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

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

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

我可以使用什么方法来实现这一点?如何处理并发性?

提前感谢。

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

使用已发布的。net源代码,可以看到此处移动文件操作是如何工作的。现在如果你按照逻辑,你会发现有一个对KERNEL32的调用。MSDN文档对此声明

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

基于此,我认为move方法是一种安全/好的移动文件的方法。

在大量文件中搜索总是要花费时间的。如果您需要提高此操作的速度,我建议您跳出常规思维来实现这一目标。例如,我见过为字母和日期生成缓存桶。使用某种缓存系统,您可以以更快的方式搜索文件,例如通过向缓存桶查询以"a"开头的文件,"这些文件像这样以a开头"的文件,或在这些日期之间的文件-等等。

这些文件可能被某些东西使用。出于本会话的目的,我们假设它们在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的所有打开的会话被关闭,删除旧文件

如果文件在同一卷上,您也可以使用硬链接而不是副本。