程序删除文件遇到的奇怪问题
我的代码出现一些问题,在跑到以下代码段的时候有时候会出错:
if (Directory.Exists(path))
{
Utils.SetAttributesNormal(new DirectoryInfo(path));
Directory.Delete(path, true);
}
Directory.CreateDirectory(path);
当时程序报的错误是:The process cannot access the file '6.zip' because it is being used by another process.
而且程序报错的堆栈信息指向了 Directory.Delete() 方法。
这错误看起来很简单,问题是谁会占用这个目录呢?这个目录只有我的这个程序自己用,目前的值是“C:\Windows\Temp\OM\”
我是在想,有没有可能:Delete 方法删除 path 的时候,还没有删完,代码直接进入 CreateDirectory 方法,把 path 锁定了所以才报 The process cannot access the file '6.zip' because it is being used by another process. 这个错?
大家有碰到过的吗?请帮忙看看,谢谢。 directory delete createdirectory process --------------------编程问答-------------------- 而且程序报错的堆栈信息指向了 Directory.Delete() 方法。
说明还没到CreateDirectory ,估计是杀毒软件在扫描吧,你到资源管理器删除掉6.zip再试试
*****************************************************************************
签名档: http://feiyun0112.cnblogs.com/ --------------------编程问答--------------------
"Delete 方法删除 path 的时候,还没有删完,代码直接进入 CreateDirectory 方法"是有这样的情况,如复制一个大的文件,后面就来句删除就出错,所以加一个Thread.Sleep(3000)即延时,或在删除前判断文件是不是在被使用:
public static bool IsFileInUse(string fileName)--------------------编程问答-------------------- 杀毒软件的可能性大
{
bool inUse = true;
if (File.Exists(fileName))
{
FileStream fs = null;
try
{
fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None);
inUse = false;
}
catch (Exception e)
{
Console.WriteLine(e.Message.ToString());
}
finally
{
if (fs != null)
{
fs.Close();
}
}
return inUse; //true表示正在使用,false没有使用
}
else
{
return false; //文件不存在则一定没有被使用
}
}
Delete 方法删除 path 的时候,还没有删完,代码直接进入 CreateDirectory 方法
不可能,Delete方法是同步的。不可能在它没有执行完的时候执行后面的代码。 --------------------编程问答-------------------- 文件锁 ?
http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx --------------------编程问答-------------------- if (Directory.Exists(path))
{
using(null)
{
Utils.SetAttributesNormal(new DirectoryInfo(path));
Directory.Delete(path, true);
}
}
if(!Directory.Exists(path))
{
Directory.CreateDirectory(path);
} --------------------编程问答-------------------- 有可能的,我碰到过,我特意关了杀毒软件, --------------------编程问答-------------------- delete是同步的,不会进入下面的方法,确实要考虑其他进程,用工具查看下文件占用情况
--------------------编程问答-------------------- 建立前加一个判断 --------------------编程问答-------------------- 更改目录,不要放在C盘和系统盘,因为对这些盘的文件的操作需要访问权限 --------------------编程问答-------------------- --------------------编程问答-------------------- 考虑线程问题···
你这个引起的原因可能是因为 你上面还没删完·下面就又开始创建了··所有会有这个问题··
删除之后sleep一段时间··试试 --------------------编程问答-------------------- 这个程序是 BS 的 Web 程序,每次上传文件处理完成之后,都会调用这段代码删除临时目录下的刚才上传的 zip 文件。
1. 和杀毒软件应该没有关系,这段代码是在服务器上跑的(页面的后台代码),server 上没有安装杀毒软件。
2. @feiyun0112,手动删除是能删掉的,删掉之后,下次做操作,又会不间断的出现这个问题,并不是每次都会。而且根据以往的报错,好像每次出错的文件名都是 纯数字.zip。难道这和文件名有关系有关系吗?应该没太大关系吧。
3. @wind_cloud2011,首先,我是先 delete 再 create,你描述的情况好像和我描述的是反的,我在设想,如果有那种可能的话,为何不在 createdirectory 那里报错,而要在 delete 这里报错?但是除此之外我又想不出别的可能性。另外,这个被删除的 12.zip 文件,大小只是 9M 左右。
哎,纠结死了,还在查代码………… --------------------编程问答-------------------- 5楼正解,使用using释放下资源应该有效 --------------------编程问答-------------------- PS: using (null) 是什么意思?从来没见过
补充:.NET技术 , C#