【问题标题】:How to forcefully unlock a file in c#?如何在c#中强制解锁文件?
【发布时间】:2011-01-14 14:34:06
【问题描述】:

我需要删除一个文件。有时,文件可能被锁定,在这种情况下,我想解锁并删除它。

到目前为止,我在研究中遇到了两种可能性。

System.IO.FileStream.Unlock

//unlock file
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool UnlockFile(IntPtr handle, int offsetLow, int offsetHi);`  

这两种方法中的任何一种都有效吗?如果是这样,您能否提供一个样本,因为我还没有让其中任何一个工作。或者,还有其他更好的方法吗?

【问题讨论】:

    标签: c# file-io io


    【解决方案1】:

    您应该使用延迟的文件操作,请参阅How To Move Files That Are Currently in Use(在此上下文中,“移动”包括删除)。

    UnlockFile 和朋友是用于文件区域锁定操作,而不是用于文件句柄锁定,请参阅Locking and Unlocking Byte Ranges in Files。希望没有 API 来解锁锁定的文件句柄,这会使锁定几乎无用...

    【讨论】:

    • Windows 文件锁定是无用的 - 它太麻烦了,陈旧的锁一直留在原地。
    【解决方案2】:

    您可以尝试向 MoveFileExMOVEFILE_DELAY_UNTIL_REBOOT 发起 P/Invoke 调用:

    在重新启动操作系统之前,系统不会移动文件。系统在执行 AUTOCHK 后立即移动文件,但在创建任何分页文件之前。因此,该参数使函数能够从以前的启动中删除分页文件。

    【讨论】:

      【解决方案3】:

      我在 RedGates 的 Reflector 中查找了对 System.IO.FileStream.Unlock() 的调用,它似乎只是调用了外部调用 UnlockFile()。方法是一回事。

      我们当前的策略是在我们合理预期文件即将解锁时延迟,否则我们会出错。

      【讨论】:

        【解决方案4】:

        最终使用 PSTools 实用程序,似乎工作正常。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-26
          • 2010-11-15
          • 2012-11-16
          相关资源
          最近更新 更多