【发布时间】:2010-09-20 12:43:18
【问题描述】:
复制当前锁定的文件的 API 调用是什么。我希望能够使用 .Net,但 Win32 调用也可以。
请随意在 Unix 或任何其他操作系统上加入大致相同的功能。
【问题讨论】:
复制当前锁定的文件的 API 调用是什么。我希望能够使用 .Net,但 Win32 调用也可以。
请随意在 Unix 或任何其他操作系统上加入大致相同的功能。
【问题讨论】:
您可以为此目的使用 VSS(卷影复制服务,而不是 Visual SourceSafe)API。虽然功能强大,但这并不是一个易于使用的 API:Overview of Processing a Backup Under VSS 应该让您了解其中涉及的内容。
尽管它是一个相对较新的 API,但 .NET 对 VSS 的支持几乎(而且不可原谅)不存在。您无法通过 Interop 调用大部分 API,并且框架文件函数将无法与 VSS 用于公开快照文件的内核命名空间一起使用。此外,还有可怕的 32/64 位和 XP-vs-Vista 问题,这也让部署变得令人兴奋(微软负责的团队应该感到非常自豪!)
无论如何,AlphaVSS 项目旨在为 .NET 带来完整的 VSS 功能,并且看起来非常有前途,尽管它仍处于预测试阶段。不过,它可能对你有用,而且它是开源的(托管 C++)。
有关如何使用 Win32 执行操作的一个很好的示例,请参阅HoboCopy。该实用程序本身就非常有用,完整的 C++ 源代码也可从 SourceForge project page 获得。
【讨论】:
根据究竟是什么锁定了您的文件,您可以执行 System.IO.File.Copy(),或创建 System.IO.BinaryReader 和 System.IO.BinaryWriter 并手动创建文件的副本读取锁定文件的块并将它们写入新文件。根据文件被锁定的原因,我见过一种方法可行但另一种方法不可行的情况。
这是“所有 .NET”的答案。
【讨论】:
和我对another question的回答差不多:
如果您使用的是 Win32,官方的做法是将其标记为在重新启动时移动,并要求用户重新启动。要标记要在重新启动时移动的文件,请使用 MoveFileEx 和 MOVEFILE_DELAY_UNTIL_REBOOT 标志。
同样的功能,只是这次你没有将 NULL 作为目标。
【讨论】: