c#在SAN中的目录之间移动文件
本文关键字:之间 移动 文件 SAN | 更新日期: 2023-09-27 18:04:03
我正在开发一个在SAN中的目录之间移动文件的winform应用程序。该应用程序在SAN的目录中搜索超过200,000个文件(每个目录)的目录中的文件列表,然后将找到的文件移动到另一个目录。
例如我有这样的路径:
'圣' xxx ' yyy '打鼾声
我在'zzz中执行搜索,然后将文件移动到'yyy,但是当我移动文件时,另一个应用程序正在向xxx, yyy和zzz目录中插入更多文件。
我不想影响使用这些目录的其他应用程序的访问或性能。
文件的完整性也是一个大问题,因为当应用程序将文件移动到'yyy目录时,另一个应用程序使用这些文件。
所有这些步骤应该并行运行。
我可以使用什么方法来实现这一点?如何处理并发性?
提前感谢。
使用已发布的。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'
而不影响访问,可以执行以下命令:
- 从
''a'b'aaaa.bin
拷贝文件到''a'c'aaaa.bin
- 更新数据库指向
''a'c'aaaa.bin
- 一旦
''a'b'aaaa.bin
的所有打开的会话被关闭,删除旧文件
如果文件在同一卷上,您也可以使用硬链接而不是副本。