如何删除Windows使用的文件?

问题描述:

当窗口中的任何程序或其他进程使用它时,是否有任何方法来删除文件? 我搜索并找到了这2种方法:如何删除Windows使用的文件?

1-在注册表中使用RunOnce项; 我不会使用这个,因为我不想等待Windows重启或其他任何东西......宁愿按时完成它!

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

谢谢。

+3

您的选项2等待重新启动。你真的想支持98/ME吗?打开文件时,您无法删除文件。如果你打开一个文件,然后其他人在你完成之前将其删除,你会感到失望。 – 2011-03-24 21:45:28

+1

当前正在使用**时,您可能想要删除哪个文件**?不能等到重新启动? – 2011-03-24 22:57:00

+1

注意:MoveFileEx(... MOVEFILE_DELAY_UNTIL_REBOOT)方法将只在用户具有管理权限时才起作用,否则如果将返回ACCESS_DENIED – 2011-03-24 23:31:35

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

所有现代桌面视窗(XP,Vista,7)也是NT。你真的需要和NT < 4或Win98一起工作吗?甚至赢得CE /手机/电话?可能不会。

如果你需要立即删除一个打开的文件,你可以做的唯一的事情就是使用调试器特权附加到每个进程,看看它是否有文件上的任何句柄打开,如果是的话关闭它们。您可以使用例如Process Explorer手动执行此操作。许多应用程序不会对他们的文件关闭做出反应;当他们试图用死胡同做某事时,希望他们排除异样。

不幸的是,在Windows中没有任何选择可以将存在Unix文件的文件附加到一个文件句柄,而无需存储在光盘上的文件名下。

+0

好吧..这会导致你附加的应用程序有很多问题,我不认为这是正确的事情。 – 2011-03-24 22:09:27

+1

确实很少。对于处理泄漏的应用程序(包括Explorer!)或杀死恶意软件可能很有用,但它不是日常工具。 – bobince 2011-03-24 22:10:58

+0

我完全同意你的看法。 – 2011-03-24 22:14:29

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

编辑: 如果您不想重新启动,唯一的选择是关闭这些句柄。 ProcessExplorer这样做,并始终工作,我没有看到任何进程崩溃。有关枚举句柄的详细信息,请参阅 http://www.codeguru.com/forum/archive/index.php/t-176997.html。但保持薄荷,你应该枚举系统中的所有进程,并在Vista +上表现出不同的行为(需要提升)

+0

-1:他说他不能等到Windows重启。 – 2011-03-24 21:49:28

+0

但是这很有帮助,因为他想要的东西不能真正做到。 – 2011-03-25 02:12:23

+0

请看这里:http://*.com/questions/14530252/how-can-i-copy-replace-a-dll – 2013-01-26 16:22:18

你不能在有人使用它时删除文件。无论你多努力,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. 

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

+0

为什么人们给-1没有任何解释?我想知道我的答案有什么问题。 – 2011-03-24 21:55:52

+0

为什么+1?有了这个循环,你可以等到重新启动。 OP需要的是行动,而不是天真的循环。所以这不是他能做的最好的事情。所以我投票以上解决方案 – 2011-03-24 22:41:48

+2

它不是一个天真的循环。他可以添加一个timout功能,所以他不会永久卡在循环中。不久或稍后,该文件打开的应用程序将关闭该文件,循环将能够删除该文件。另外,关闭其他应用程序处理并不是一个好主意。 – 2011-03-24 22:47:04

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

一个非常钝的方法是关闭该句柄。

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

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

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

+0

我认为OP已经有这么多的建立,你只是重新说明这个问题。什么是解决方案? – 2013-01-26 16:24:29

+0

解决方案是强制关闭这些文件的句柄。 – 2013-01-26 18:47:21

+0

使用第三方应用程序?问题是关于编写代码来做到这一点,而不是手动执行。当然,你需要关闭手柄,这是常识部分。无论如何,我只是想解释为什么我认为你被低估了。 – 2013-01-26 19:02:52