如何删除Windows使用的文件?

时间:2011-03-24 21:39:20

标签: delphi delphi-7

在Windows中使用任何程序或其他进程时,有没有办法删除文件? 我搜索并找到了这两种方式:

1-在Registry中使用RunOnce键; 我不打算使用它,因为我不想等待Windows重启或其他任何事情...更喜欢按时完成!

2-使用此页面中声明的方式:http://www.delphipages.com/forum/showthread.php?t=201190 这里的问题是它在NT窗口下很有用,我需要一种适用于所有Window的方法!

谢谢。

4 个答案:

答案 0 :(得分:4)

  

这里的问题是它在NT窗口下很有用,我需要一种适用于所有Window的方法!

所有现代桌面窗口(XP,Vista,7)也都是NT。你真的需要使用NT< 4或Win98吗?甚至赢得CE /手机/手机?可能不是。

如果您需要立即删除一个打开的文件,您可以做的唯一事情就是使用调试器权限附加到每个进程,看看它是否在文件上打开了任何句柄,如果是这样,请将它们关闭在它下面。您可以使用Process Explorer以手动方式执行此操作。许多应用程序对其文件关闭不会做出很好的反应;当他们试图用死手柄做某事时,他们会期待他们出类拔萃。

不幸的是,Windows中没有选项可以将独立于文件句柄附加的Unix风格文件存储在光盘上。

答案 1 :(得分:1)

使用MOVEFILE_DELAY_UNTIL_REBOOT标志尝试MoveFileEx。将推迟移动或删除操作,直到重新启动。

修改: 如果您不想重新启动,唯一的选择是关闭这些句柄。 ProcessExplorer这样做并且一直有效,我没有看到任何崩溃的过程。在以下位置查看有关进程中枚举句柄的更多信息 http://www.codeguru.com/forum/archive/index.php/t-176997.html。但请注意,您应该枚举系统中的所有进程,并在Vista +上表现不同(您需要提升)

答案 2 :(得分:1)

当有人使用该文件时,您无法删除该文件。无论你怎么努力,Windows都不会让你。它可以使用某些文件,但一般情况下它不起作用。 当没有人使用该文件时,您可以尝试推迟删除。你可以:

1 - 使用RunOnce,但你不想要那个。
2 - 等待循环,尝试删除文件。伪代码:

DeleteFile  
Check if you was able to delete or if file still exists.  
if you are able to delete, then exit loop.  

这是你能做的最好的,也是我能记住的。

答案 3 :(得分:-1)

您的文件很可能被锁定,因为某些进程有一个对其打开的句柄。这是删除或移动文件时Access denied结果的最常见原因。

一个非常直率的方法是关闭那个句柄。

然后Handles tool from SysInternals(您也可以下载源代码)可以为您做到这一点:我已成功使用它。

注1:您需要管理员权限才能使用它。

注2:关闭来自其他流程的句柄被认为非常粗鲁,并且可能会使该流程不稳定。