1

我有一个总是创建一个目录并将一些文件(图像)放入其中的函数。当代码第一次运行时,没有问题。第二次(总是),当我必须删除目录时出现错误(因为我想重新创建它以将图像放入其中)。错误是“该进程无法访问文件'...',因为它正在被另一个进程使用”。访问此文件的唯一进程是此函数。这就像“不离开”文件的功能。

如何通过明确的解决方案解决此问题?

这是代码的一部分:

String strPath = Environment.CurrentDirectory.ToString() + "\\sessionPDF";
if (Directory.Exists(strPath))
      Directory.Delete(strPath, true); //Here I get the error
Directory.CreateDirectory(strPath);
//Then I put the files in the directory
4

5 回答 5

2

如果您的代码或其他进程正在提供图像,它们将被无限期锁定。如果是 IIS,它们会在服务期间被锁定一小段时间。我不确定这一点,但如果资源管理器正在为图像创建拇指,它可能会在执行此操作时锁定文件。这可能是一瞬间,但如果您的代码和该进程发生冲突,这是一个竞争条件。

确保完成后释放锁。如果该类实现了 IDisposable,如果您没有对该对象进行大量工作,请在其周围包装一个 using 语句:

using (var Bitmap = ... || var Stream = ... || var File = ...) { ... }

...这将在之后关闭对象并且文件不会被锁定。

于 2012-04-20T15:05:11.207 回答
1

只是在没有看到转储文件的代码的情况下在这里冒险,但是如果您正在使用FileStreamsBitmap对象,我会仔细检查以确保您在运行第二种方法之前正确处理所有这些对象。

于 2012-04-20T15:01:49.780 回答
0

在这种情况下,唯一明确的解决方案是跟踪谁在处理对目录的访问并通过释放该访问来修复错误。

如果处理访问的对象/资源是第 3 方,或者以任何方式无法更改或访问,那么是时候修改架构,以不同的方式处理 IO 访问了。

希望这可以帮助。

于 2012-04-20T15:01:48.270 回答
0

听起来您在创建文件时没有释放文件句柄。尝试在 using 语句中执行所有 IO,这样文件将在您完成后自动释放。

http://msdn.microsoft.com/en-us/library/yh598w02%28v=vs.80%29.aspx

于 2012-04-20T15:02:47.103 回答
0
  • 我见过病毒扫描程序会扫描新文件并阻止文件被删除的情况,尽管这种可能性很小。

  • 确保.Dispose所有IDisposable对象都没有,并确保没有任何内容更改您Environment.CurrentDirectory要删除的目录。

于 2012-04-20T15:07:21.593 回答