处理正在使用的大型文件

时间:2017-12-06 11:39:21

标签: c++ winapi

我想检索某些进程正在使用的非常大的文件(数百GB到x TB)的句柄。我正在考虑暂时关闭正在运行的进程,然后将它们复制到某个特定位置。但出于几个原因,这种方法看起来很笨拙。

  1. 文件太大,因此将它们从一个地方复制到另一个地方需要时间 在不同的磁盘类型上。
  2. 文件复制过程完成后,我必须打开已停止的进程。但是,如果我的用户需要加载/复制其他大型文件 处理所述进程控制的文件?我必须再次阻止它们。我不想这样做 因为他们必须在我的机器上完成许多关键任务。
  3. 所以我有2个问题,

    1. 请解释我的做法是错误的。我上面说的只是 我个人的想法,还没有任何编码。
    2. 是否有任何方法可以快速克隆~50个大文件(1-5 TB)(大约10秒左右)并在后台静默?

1 个答案:

答案 0 :(得分:0)

如果原始进程以非共享模式打开文件(似乎很可能是这样的大文件),那么在不关闭该进程的情况下执行此操作可能会运气不好 - 或者至少让它放弃文件。如果它允许至少读取共享,我建议您使用事务性NTFS - 尽管所有文档都有关于此的警告。

创建一个KTM事务管理器(通过CreateTransactionManager),创建一个KTM事务(使用CreateTransaction),然后使用CopyFileTransacted进行实际复制。最后提交事务(CommitTransaction),然后关闭所有句柄。这样做将确保文件处于一致状态(不会从原始进程部分写入)。

也可能是备份API可以忽略共享模式(我知道如果你的进程启用了适当的权限,而不确定共享,它可以忽略安全检查。)