如何直接从磁盘复制锁定的文件并确保文件完好无损?

Posted

技术标签:

【中文标题】如何直接从磁盘复制锁定的文件并确保文件完好无损?【英文标题】:How do I copy a locked file directly from the disk and make sure that the file is intact? 【发布时间】:2011-09-09 14:31:28 【问题描述】:

我正在编写的应用程序需要能够复制被锁定的文件。我们尝试使用卷影复制,当它成功复制文件时,锁定文件的应用程序崩溃了,因为它在我们复制文件时无法获得锁。

我相信我唯一的选择是绕过操作系统并直接从磁盘读取。问题是,如果我直接读取磁盘,我无法确定文件的完整性,如果它在写入过程中,文件将处于损坏状态。

经过数小时的搜索,我找到了一个实用程序,它直接从磁盘复制文件,并使用文件系统驱动程序在复制时缓存写入,以确保文件处于完整状态。但是,该实用程序非常昂贵,我可能需要使用 100k+ 的许可证。

有人对如何完成我想要做的事情有任何想法吗?

我们计划将系统限制为仅限 NTFS 卷。

【问题讨论】:

它真的需要在 NTFS 上运行吗?我会尝试在 ext4 或类似设备上的 linux 上的 wine 下运行该应用程序,然后复制文件。 是的,我们确实需要在 NTFS 上,我们无法控制硬件。 我有点困惑,为什么在您使用卷影复制时应用程序崩溃了。这不应该发生。卷影副本是整个文件系统的只读副本。锁定机制不应受到影响。 据我了解,VSS 挂钩仅在应用程序无法将数据设计为始终处于(崩溃)一致状态时才能使数据进入一致状态。跨度> @UrOni 是正确的。您尝试做的是卷影复制存在的全部原因。如果它不工作,要么你误解了错误,要么卷影复制中存在错误。 【参考方案1】:

您能否在执行复制时获取已锁定应用程序的进程 ID 并暂停其线程?像这样http://www.codeproject.com/KB/threads/pausep.aspx

【讨论】:

很遗憾,没有,应用程序需要继续运行,并且很可能在我们复制文件时读取和写入文件。 应用程序到底是什么?或者更好的是,你为什么需要这样备份? 您可以在目标应用程序中注入一个 dll 来挂钩 createfile/read/write/close 函数并实现所需的缓存,然后在文件备份完成后应用更改。跨度> 您应该如何确定应用程序何时使文件处于一致状态? 这不是问的问题,Eric 要求替代 10 万美元以上的软件,不需要反对,因为我的回答是正确的,但不符合他的要求。【参考方案2】:

This“分层驱动程序”的描述可能有用。不过我对此一无所知。

另外,如果文件被锁定,那么您可以“观看”它并等待它被解锁然后快速复制它吗?

【讨论】:

【参考方案3】:

我最终使用了由Napalm 编写的名为 DirectCopy 的 C 程序。效果不错。

http://www.rohitab.com/discuss/topic/24252-ntfs-directcopy-method-from-napalm/

【讨论】:

需要注意的是,它不会验证文件胆的完整性,但会直接复制文件而不创建文件锁。它能够复制一个应用程序正在使用的文件,其中 VSS 副本导致应用程序崩溃。

以上是关于如何直接从磁盘复制锁定的文件并确保文件完好无损?的主要内容,如果未能解决你的问题,请参考以下文章

Linux磁盘分区无损扩容-fdisk命令

Vmware复制完好的linux目录后网卡操作

所以我刚刚创建了一个文本文件并使用 with 循环从现有文件中复制了文本。如何在同一个 prog 中打开新创建的文件?

玩转 ByteBuffer

C# - 仅当文件完全复制到磁盘时才复制文件

如何在不从磁盘中删除文件的情况下 git rm 文件? [复制]