如何在Windows下编程复制被锁定的文件或文件夹?

13

如何调用API复制当前被锁定的文件。我希望能使用.Net,不过Win32 API也可以接受。

欢迎讨论Unix或其他操作系统上相同的功能。

3个回答

17
您可以使用VSS(卷影副本服务,而不是Visual SourceSafe)API来实现此目的。虽然功能强大,但这并不是易于使用的API:在VSS下处理备份概述应该让您了解所涉及的内容。
尽管它是一个相对较新的API,但.NET对VSS的支持基本上(且不可原谅地)不存在。您无法通过Interop调用大多数API,并且框架文件函数无法与内核命名空间VSS一起使用,以公开快照文件。作为奖励,32/64位和XP-vs-Vista问题令人震惊,使部署也变得令人兴奋(Microsoft的负责团队应该真的感到自豪!)
无论如何,AlphaVSS项目旨在将完整的VSS功能带入.NET,并且看起来非常有前途,尽管它仍处于预测试阶段。它可能只是为您完成任务,并且它是开源的(Managed C ++)。
关于如何使用Win32进行操作的很好的示例,请参见HoboCopy。该实用程序本身非常有用,并且SourceForge项目页面还提供完整的C ++源代码。

5

和我回答另一个问题的答案几乎一样:

如果你在Win32上,官方的方法是将其标记为在重启时移动,并要求用户重新启动。要将文件标记为在重启时移动,请使用MoveFileEx并使用MOVEFILE_DELAY_UNTIL_REBOOT标志。

这是相同的函数,只是这次你不会像目标传递NULL。


4

根据您的文件被锁住的原因,您可以使用System.IO.File.Copy(),或者创建一个System.IO.BinaryReader和一个System.IO.BinaryWriter并手动读取文件块并将它们写入新文件来创建副本。根据文件锁定的原因,有时可能只能使用其中一种方法。

这是完全使用.NET的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接