我有一个总是创建目录并在其中放入一些文件(图像)的函数。 当代码第一次运行时,没问题。第二次(总是),当我必须删除目录时会出错(因为我想重新创建它以将图像放入其中)。错误是“进程无法访问文件'...',因为它正被另一个进程使用”。访问此文件的唯一进程是此函数。 这就像“不离开”文件的功能一样。
如何通过明确的解决方案解决此问题?
这是代码的一部分:
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
答案 0 :(得分:2)
如果您的代码或其他进程正在提供图像,它们将无限期锁定。如果它是IIS,它们在服务时会被锁定很短的时间。我不确定这一点,但如果资源管理器为图像创建拇指,它可能会锁定文件。它可能是一瞬间,但如果你的代码和那个进程发生碰撞,那就是竞争条件。
确保在完成后释放锁定。如果该类实现了IDisposable,如果您没有对该对象进行大量工作,请在其周围包装using语句:
using (var Bitmap = ... || var Stream = ... || var File = ...) { ... }
...之后关闭对象,文件不会被锁定。
答案 1 :(得分:1)
只是在这里没有看到转储文件的代码,但是如果你正在使用FileStreams
或Bitmap
个对象,我会仔细检查以确保你正确处理掉所有文件在运行第二种方法之前的那些对象。
答案 2 :(得分:0)
在这种情况下唯一明确的解决方案是通过释放访问权限来跟踪谁正在处理对目录的访问并修复错误。
如果处理访问权限的对象/资源是第三方,或以任何方式无法更改或访问,则需要修改体系结构,以不同的方式处理IO访问。
希望这有帮助。
答案 3 :(得分:0)
听起来你在创建文件时没有释放文件句柄。尝试在using语句中执行所有IO,这样文件将在您完成后自动释放。
http://msdn.microsoft.com/en-us/library/yh598w02%28v=vs.80%29.aspx
答案 4 :(得分:0)
我见过病毒扫描程序扫描新文件并阻止文件被删除的情况,尽管这种可能性很小。
请务必.Dispose
个IDisposable
个对象,并确保没有任何内容已将Environment.CurrentDirectory
更改为您要删除的目录。