当前位置:编程学习 > C#/ASP.NET >>

程序删除文件遇到的奇怪问题

我的代码出现一些问题,在跑到以下代码段的时候有时候会出错:

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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,