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

youzelin 2013-10-17 05:29:05
我的代码出现一些问题,在跑到以下代码段的时候有时候会出错:

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. 这个错?
大家有碰到过的吗?请帮忙看看,谢谢。
...全文
320 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
youzelin 2013-10-18
  • 打赏
  • 举报
回复
PS: using (null) 是什么意思?从来没见过
逸世尘角 2013-10-18
  • 打赏
  • 举报
回复
5楼正解,使用using释放下资源应该有效
youzelin 2013-10-18
  • 打赏
  • 举报
回复
这个程序是 BS 的 Web 程序,每次上传文件处理完成之后,都会调用这段代码删除临时目录下的刚才上传的 zip 文件。 1. 和杀毒软件应该没有关系,这段代码是在服务器上跑的(页面的后台代码),server 上没有安装杀毒软件。 2. @feiyun0112,手动删除是能删掉的,删掉之后,下次做操作,又会不间断的出现这个问题,并不是每次都会。而且根据以往的报错,好像每次出错的文件名都是 纯数字.zip。难道这和文件名有关系有关系吗?应该没太大关系吧。 3. @wind_cloud2011,首先,我是先 delete 再 create,你描述的情况好像和我描述的是反的,我在设想,如果有那种可能的话,为何不在 createdirectory 那里报错,而要在 delete 这里报错?但是除此之外我又想不出别的可能性。另外,这个被删除的 12.zip 文件,大小只是 9M 左右。 哎,纠结死了,还在查代码…………
敌敌畏耶 2013-10-18
  • 打赏
  • 举报
回复
考虑线程问题··· 你这个引起的原因可能是因为 你上面还没删完·下面就又开始创建了··所有会有这个问题·· 删除之后sleep一段时间··试试
享受编程乐趣 2013-10-17
  • 打赏
  • 举报
回复
更改目录,不要放在C盘和系统盘,因为对这些盘的文件的操作需要访问权限
wind_cloud2011 2013-10-17
  • 打赏
  • 举报
回复
建立前加一个判断
xisat 2013-10-17
  • 打赏
  • 举报
回复
delete是同步的,不会进入下面的方法,确实要考虑其他进程,用工具查看下文件占用情况
wind_cloud2011 2013-10-17
  • 打赏
  • 举报
回复
有可能的,我碰到过,我特意关了杀毒软件,
weizhuangwen 2013-10-17
  • 打赏
  • 举报
回复
if (Directory.Exists(path)) { using(null) { Utils.SetAttributesNormal(new DirectoryInfo(path)); Directory.Delete(path, true); } } if(!Directory.Exists(path)) { Directory.CreateDirectory(path); }
emailtome 2013-10-17
  • 打赏
  • 举报
回复
文件锁 ? http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx
threenewbee 2013-10-17
  • 打赏
  • 举报
回复
杀毒软件的可能性大 Delete 方法删除 path 的时候,还没有删完,代码直接进入 CreateDirectory 方法 不可能,Delete方法是同步的。不可能在它没有执行完的时候执行后面的代码。
wind_cloud2011 2013-10-17
  • 打赏
  • 举报
回复
"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;           //文件不存在则一定没有被使用
            }
}
feiyun0112 2013-10-17
  • 打赏
  • 举报
回复
而且程序报错的堆栈信息指向了 Directory.Delete() 方法。

说明还没到CreateDirectory ,估计是杀毒软件在扫描吧,你到资源管理器删除掉6.zip再试试

*****************************************************************************
签名档: http://feiyun0112.cnblogs.com/

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧