C# 有没有一种方法可以删除正在执行的文件而不杀死它?

C# 有没有一种方法可以删除正在执行的文件而不杀死它?,c#,c,windows,security,C#,C,Windows,Security,我有一个我认为很复杂的问题。我有一个在Windows下执行的应用程序,需要很长时间才能完成。我想让它保持运行(正常),但我想杀死磁盘上的文件-但显然这是不可能的,因为它被锁定/正在使用。我需要一种方法来解除它与正在运行的进程的关联,从而杀死它,同时保持文件运行。任何代码或工具的示例都是非常受欢迎的 好的,变通方法是受欢迎的,例如,如果有一种方法可以从进程中产生它,则键入master并迁移子进程以杀死应用程序,或者任何其他可行的想法都是受欢迎的,即使是丑陋的想法。:) 谢谢。这是您想要杀死的应用程

我有一个我认为很复杂的问题。我有一个在Windows下执行的应用程序,需要很长时间才能完成。我想让它保持运行(正常),但我想杀死磁盘上的文件-但显然这是不可能的,因为它被锁定/正在使用。我需要一种方法来解除它与正在运行的进程的关联,从而杀死它,同时保持文件运行。任何代码或工具的示例都是非常受欢迎的

好的,变通方法是受欢迎的,例如,如果有一种方法可以从进程中产生它,则键入master并迁移子进程以杀死应用程序,或者任何其他可行的想法都是受欢迎的,即使是丑陋的想法。:)


谢谢。

这是您想要杀死的应用程序必须处理的问题。它不应该在长时间运行的过程中保持文件打开。如果应用程序未关闭该文件,则删除该文件将导致该应用程序出现异常。

答案中的一些建议(完全被盗):

您可以使用在下次重新启动时将文件标记为删除

您可以插入dll以自己关闭句柄:

典型的方法如下。你说过你想用C#来做这件事,所以现在

  • 如果不知道哪个进程锁定了文件,则需要检查每个进程的句柄列表,并查询每个句柄以确定它是否标识了锁定的文件。在C#中执行此操作可能需要P/Invoke或中介C++/CLI来调用您需要的本机api
  • 一旦确定哪个进程锁定了文件,您就需要安全地将一个小型本机DLL注入该进程(您也可以注入一个托管DLL,但这更麻烦,因为您必须启动或附加到.NET运行时)
  • 该引导DLL然后使用CloseHandle等关闭句柄。 从本质上说:解锁“锁定”文件的方法是将DLL插入有问题进程的地址空间,然后自己关闭它。您可以使用本机代码或托管代码来实现这一点。不管怎样,您都需要少量的本机代码,或者至少对相同的代码进行P/Invoke
  • 有用链接:



    不确定这是否适用于每个Windows版本,但它是:

  • 将进程可执行文件“foo.exe”重命名为“foo.old”
  • 将新的“foo.exe”放在正确的位置
  • 向进程发送消息,这样它将执行新的“foo.exe”映像并终止自己
  • 启动时,删除程序目录中的“foo.old”文件

  • 更新:哎呀,看起来你不想放新的图片,只是删除旧的。那么MoveFileEx是唯一的“合法”选项。

    Fischermaen我不想终止应用程序,我想让它继续运行,我只想从磁盘上删除它。Thanks@user1007489为什么要删除系统上运行的应用程序?对不起,那完全是胡说八道。每个卸载程序都会先停止应用程序,然后将其从磁盘上删除。@Fischermaen-我想他指的是文件,一个应用程序正在读取的文件,这当然也是毫无意义的。@Ramhound-我们也在谈论同样的问题。@Fischermaen-我知道我们是……正如你所说的……毫无意义:-)当应用程序读取文件时,文件被锁定,这在几乎任何操作系统上都会发生。你想做的没有意义,你想删除一个应用程序正在读取的文件,如果你删除这个文件,应用程序就会失败。我不相信你想要的是可能的。您是否考虑过更改应用程序的工作方式,使其读取文件,然后释放锁,然后对内存中的文件执行任何操作?您需要一种方法来通知应用程序停止使用文件并关闭连接。我不知道您为什么会被否决。。。这是一个完全合法的系统问题。例如,在Linux上,可以在应用程序运行时删除磁盘上的二进制文件。我认为在删除文本段后,不能保证在部分文本段中进行交换,但没有什么可以阻止您。他的问题是类似的东西在Windows上是否可能。是的,丹尼斯顿。t是正确的,这正是我所想的。谢谢。这是可能的,但这是恶意软件会做的。嗨,山姆·霍尔德。我正在考虑,但这需要管理权限,因为它会写入HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations,这需要管理员权限,而不是我的应用程序正在运行的情况。还有别的想法吗?谢谢。我从另一个人那里加了一些(偷来的)答案question@user1007489你应该接受问题的答案@Sam,我认为在这种情况下注入DLL不起作用,因为我认为应用程序无法关闭自己可执行文件的句柄。即使这是可能的,也不需要向进程中注入DLL,因为它是OP自己的代码!嗨,这是一个非常有趣的问题,我搜索并找到了一些潜在的解决方案。。。(看起来很好,不确定是否有效)。(不是很好的代码,但应该可以工作)。(寻找凝固汽油弹代码,非常好,但不确定它是否有效)。如果你找到一个可靠的解决方案,请在这里张贴,我也感兴趣。祝你好运