15

我在这里发现了一个类似的问题,但它被关闭/接受,答案是“不要那样做”。

我的情况是,我不在乎其他应用程序会发生什么,我想获取一个可能被其他人锁定的文件(如果需要,粗鲁地)并按照我的方式处理它。我可能需要移动、重命名或删除此文件。

基本上我需要处理一个目录中的文件,该目录由一个不清理它的锁的应用程序创建。我知道应用程序在我的调用时已完成处理,但我需要在运行时终止锁。此外,我似乎与本地 AV 软件的读取冲突,该软件扫描服务器所在的远程共享。

所有这些加起来就是一个无法解决的“强制关闭”情况,所以我可以做我需要做的事情。有谁知道该怎么做?

4

3 回答 3

5

首先,您可以使用这篇文章来验证锁定它们的是狡猾的应用程序:

如何找出使用 .NET 锁定文件的进程?

然后这篇文章概述了一种关闭它们的方法:

http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/04a1e899-2a38-4d95-8ed5-6d53344e4d76

于 2010-08-19T22:53:49.143 回答
2

这可能无关紧要,如果有人评论,但我之前在资源管理器中使用过一种解决方法来解决文件锁定问题。
如果一个文件被一个已经死亡的进程锁定,Windows 通常不会让你删除它,但是如果你在其他地方创建了一个同名的新文件,将它移动到文件夹中它会成功。然后您可以删除新文件,一切都很好。
要将它用于您的应用程序,您必须能够在执行此操作之前读取文件并将其保存在内存中,然后在摆脱旧文件后将其写回。
也许它会有所帮助,也许不会,但值得一试。

于 2010-08-19T23:04:54.390 回答
2
    foreach (var process in Process.GetProcessesByName("excel")) //whatever you need to close 
    {
        if (process.MainWindowTitle.Contains("test.xlsx"))
        {
            process.Kill();
            break;
        }
    }

或者

    foreach (var process in Process.GetProcesses())
    {
        if (process.MainWindowTitle.Contains("test.dat"))
        {
            process.Kill();
            break;
        }
    }
于 2017-10-17T04:06:52.587 回答