我正在寻找一种方法来删除使用C#被另一个进程锁定的文件.我怀疑该方法必须能够找到哪个进程正在锁定文件(可能是通过跟踪句柄,虽然我不知道如何在C#中执行此操作)然后在能够使用完成文件删除之前关闭该进程File.Delete().
Ish*_*eel 36
杀死其他进程并不是一件好事.如果您的方案涉及卸载等操作,则可以使用MoveFileExAPI函数在下次重新引导时将文件标记为删除.
如果您确实需要删除其他进程正在使用的文件,我建议您在考虑任何解决方案之前重新考虑实际问题.
小智 15
典型的方法如下.你说你想用C#做这个,所以这里......
基本上:解锁"锁定"文件的方法是将DLL文件注入违规进程的地址空间并自行关闭.您可以使用本机代码或托管代码执行此操作.无论如何,你将需要少量的本机代码或至少P/Invoke.
有用的网址:
祝好运!
如果你想以编程方式进行.我不确定......我真的建议反对它.如果您只是在自己的机器上进行故障排除,SysInternals Process Explorer可以为您提供帮助
运行它,使用Find Handle命令(我认为它在查找或句柄菜单中),并搜索文件的名称.找到手柄后,您可以强行关闭它们.
然后,您可以删除该文件,依此类推.
注意,这样做可能会导致拥有句柄的程序表现得很奇怪,因为你只是从它下面拉出了众所周知的地毯,但是当你调试自己的错误代码时,或者在visual studio/windows explorer中它运行良好即使你告诉他们关闭文件很久以前就是废话并且没有释放文件句柄...叹气:-)
您可以使用这个程序Handle来查找哪个进程锁定了您的文件。这是一个命令行工具,所以我猜你会使用它的输出。我不确定以编程方式找到它。
如果删除文件可以等待,您可以指定在您的计算机下次启动时将其删除:
启动REGEDT32 (W2K)或REGEDIT (WXP)导航至:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager
Run Code Online (Sandbox Code Playgroud)W2K 和 WXP
W2K:
编辑
添加值...
数据类型:REG_MULTI_SZ
值名称:PendingFileRenameOperations
OK
WXP:
编辑
新的
多字符串值
enter
PendingFileRenameOperations
在数据区,输入"\??\" + filename要删除。LFN 可以在不嵌入引号的情况下输入。要删除C:\Long Directory Name\Long File Name.exe,请输入以下数据:
\??\C:\Long Directory Name\Long File Name.exe
Run Code Online (Sandbox Code Playgroud)
然后按OK。
“目标文件名”是一个空(零)字符串。输入如下:
W2K:
编辑
二进制
选择数据格式:十六进制
单击十六进制字符串的末尾
输入 0000(四个零)
OK
WXP:
右键单击值
选择“修改二进制数据”
单击十六进制字符串的末尾
输入 0000(四个零)
OK
关闭REGEDT32/REGEDIT并重新启动以删除文件。
| 归档时间: |
|
| 查看次数: |
48811 次 |
| 最近记录: |