由于另一个进程正在使用该文件,因此该进程无法访问该文件。

24

我有一套夜间报告。

有时会出现异常:

该进程无法访问文件,因为它正被另一个进程使用。

我如何确定是哪个进程正在持有该文件?我认为可能是 McAfee,但需要证明。


2
只是一个想法,很可能不是你的病毒保护软件。根据我的经验,它从来都不是这个问题。实际上,通常是我的代码有问题。确保在打开文件时,你已经使用了 "using"。 - C. Ross
Stack Overflow上的那篇文章是对dll的锁定。这是对文本文件的文件锁定。我确实有一个using语句。 - Greg Finzer
我会检查您用于进程的任何主体的文件夹访问权限。它可能没有移动它的权利,只有只读访问权限。 - Greg Finzer
10个回答

19
问题在于.NET中的MailMessage保留了文件附件,必须对附件进行处理(dispose),然后才能正常工作。

9

我正在尝试在C#中重命名一个文件,我只是使用file.move(source,destination)。但每次尝试时都会出现错误,提示该文件正在被另一个进程使用。我是通过ASP.NET、IIS6的Web界面进行重命名的。谢谢。 - safi
@safi 你需要将这个作为一个新问题提出来。欢迎在评论中给我链接。 - C. Ross
我曾经提出过这个问题,但没有得到合适的答案。链接是https://dev59.com/XFTTa4cB1Zd3GeqPvcev。 - safi

3
Attachment data = new Attachment(@"c:\filename");

'send email....

data.Dispose();    

1

确认。我遇到了类似的问题,也按照Greg所说的做了。

在发送消息后的finally块中,我只需加入以下代码即可释放文件句柄:

foreach(Attachment a in message.Attachments) a.Dispose();

@Mike 我在尝试使用C#重命名文件,我简单地使用file.move(源,目标)方法,但每次尝试时都会报错,提示该文件正在被另一个进程使用。我是通过ASP.NET和IIS6的Web界面来进行文件重命名的。谢谢。 - safi

1

1
有没有任何方法可以在C#中以编程方式实现这个? - Greg Finzer
我在这里找到了一个重复的问题:https://dev59.com/MHRC5IYBdhLWcg3wYP6h - Kamarey
1
Stack Overflow上的另一篇帖子是关于dll锁定的。而这个问题是关于文本文件的文件锁定。 - Greg Finzer

0

Filemon 可能是你正在寻找的工具。

(或者甚至是 Process Monitor,它显然已经取代了 FileMon。)


我正在尝试在C#中重命名一个文件,我只是使用file.move(source,destination)。但每次尝试时都会出现错误,提示该文件正在被另一个进程使用。我是通过ASP.NET、IIS6的Web界面进行重命名的。谢谢。 - safi

0
  1. Process Explorer > 查找 > 查找句柄 > 输入文件名。
  2. Unlocker。尝试打开它,如果有锁定,Unlocker 将打开并显示锁定它的程序。

我正在尝试在C#中重命名一个文件,我只是使用file.move(source,destination)方法,但每次尝试时都会出现错误,提示该文件正在被另一个进程使用。我是通过ASP.NET、IIS6的Web界面进行重命名的。谢谢。 - safi

0

我刚遇到了同样的问题,但在我的情况下,我试图在Visual Studio 2012中删除一个.mdf文件。关于错误的信息不多,无法帮助我解决这个问题,所以我来这里寻求帮助。然后我意识到,即使是类似的问题,我也必须处理不同的过程。

我所做的就是尝试在Windows资源管理器中删除.mdf文件,然后它给了我一个错误,说SQL Server 2008 R2实际上仍然持有该文件,即使我已经删除了数据库。一旦我知道了这一点,我所要做的就是关闭SQL Server 2008 R2,然后再次尝试删除该文件,这样就可以了。

如果您需要关于如何打开和关闭SQL Server 2008 R2的说明,请参见下面的链接。

打开和关闭SQL Server


0
在 dispose 之后使用 GC.Collect() 应该可以解决这个问题。

这在我的情况下有效,因为处理不够快或严格。但这样做感觉很糟糕。一定有更好的方法。 - Steve

0

我试图启动一个Java程序,但收到了一条消息。在任务管理器中查看,已经有一个Java任务正在运行(循环?)当我杀死该进程后,我的进程才能运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接