0

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

例如我有这样的路径:

\san\xxx\yyy\zzz

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

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

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

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

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

提前致谢。

4

2 回答 2

0

使用已发布的 .net 源代码,可以在此处了解移动文件操作的工作原理。现在,如果您遵循逻辑,您会发现调用KERNEL32. 此状态的MSDN 文档

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

基于此,我会说 move 方法是移动文件的安全/好方法。

搜索大量文件总是需要时间。如果您需要提高此操作的速度,我建议您开箱即用地实现这一目标。例如,我见过为字母和日期生成的缓存桶。使用某种缓存系统,您可以以更快的方式搜索文件,例如通过向缓存桶询问以“a”开头的文件以获取“这些文件以 a 开头”文件,或这些日期之间的文件 - 等等。

于 2015-07-23T00:49:23.490 回答
0

Presumably, these files are used by something. For the purposes of this conversation, let's assume they are indexed in an SQL Database.

TABLE: Files

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

To move them to \\a\c\ without impacting access, you can execute the following:

  1. Copy the file from \\a\b\aaaa.bin to \\a\c\aaaa.bin
  2. Update the database to point to \\a\c\aaaa.bin
  3. Once all open sessions have been closed for \\a\b\aaaa.bin, delete the old file

If the files are on the same volume, you could also use a hardlink instead of a copy.

于 2015-07-23T01:09:41.730 回答