我需要删除一个文件。有时,文件可能会被锁定,在这种情况下,我想解锁并删除它。
到目前为止,我在研究中遇到了两种可能性。
System.IO.FileStream.Unlock
和
//unlock file
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool UnlockFile(IntPtr handle, int offsetLow, int offsetHi);`
这两种方法中的任何一种都有效吗?如果是这样,请你提供样品,因为我没有得到这些中的任何一个。或者,还有另一种更好的方法吗?
答案 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)
您可以尝试对MoveFileEx
和MOVEFILE_DELAY_UNTIL_REBOOT
进行P / Invoke调用:
在重新启动操作系统之前,系统不会移动文件。执行AUTOCHK后,系统会立即移动文件,但在创建任何页面文件之前。因此,此参数使该函数能够从以前的启动中删除分页文件。
答案 3 :(得分:0)
使用PSTools实用程序结束,似乎工作正常。