如何在c#中强制解锁文件?

时间:2010-02-08 23:42:57

标签: c# file-io io

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

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

System.IO.FileStream.Unlock

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

这两种方法中的任何一种都有效吗?如果是这样,请你提供样品,因为我没有得到这些中的任何一个。或者,还有另一种更好的方法吗?

4 个答案:

答案 0 :(得分:2)

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

UnlockFile和朋友用于文件区域锁定操作,而不是用于文件句柄锁定,请参阅Locking and Unlocking Byte Ranges in Files。 Hopefuly没有用于解锁锁定文件句柄的API,这会导致锁定很多用途......

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您可以尝试对MoveFileExMOVEFILE_DELAY_UNTIL_REBOOT进行P / Invoke调用:

  

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

答案 3 :(得分:0)

使用PSTools实用程序结束,似乎工作正常。