none
删除文件夹 RRS feed

答案

  •         /// <summary>
            /// 删除文件
            /// </summary>
            /// <param name="dir">目录路径</param>
            /// <param name="delname">待删除文件或文件夹名称</param>
            public void DeleteFolder(string dir,string delname)
            {          
                if (Directory.Exists(dir))
                {
                    foreach (string d in Directory.GetFileSystemEntries(dir))
                    {
                        string tmpd = d.Substring(0, d.LastIndexOf("\\")) + "\\" + delname;
                        if (Directory.Exists(d))
                        {
                            if (d == tmpd)
                                Directory.Delete(d, true);
                            else
                                DeleteFolder(d, delname);//递归删除子文件夹  
                        }
                        else if(File.Exists(d))
                        {
                            if (d == tmpd)
                                File.Delete(d);
                        }
                    }
                }           
            }

    2009年6月1日 8:38
  •    private void DeleteDirectory(string fParentPath)
        {
            foreach (string fPath in Directory.GetDirectories(fParentPath))
            {
                string fDirectoryName =(new  DirectoryInfo(fPath)).Name;
                if (fDirectoryName == "文件夹1" ||
                    fDirectoryName == "文件夹2" ||
                    fDirectoryName == "文件夹3")
                {
                    Directory.Delete(fPath);
                }
                else
                {
                    DeleteDirectory(fPath);
                }
            }
        }
    // 调用 DeleteDirectory(@"D:\test");
    知识改变命运,奋斗成就人生!
    2009年6月1日 8:42
    版主
  • 你好!
         我补充一下啊,如果你想删除某种类型的名字的文件夹,可以使用正则表达式来匹配文件名
    private void DeleteDirectory(string fParentPath)
        {
            if(Directory.Exists(fParentPath)//这里最好判断一下,以免发生异常
            {
            foreach (string fPath in Directory.GetDirectories(fParentPath))
            {
                string fDirectoryName =(new  DirectoryInfo(fPath)).Name;
                if (//这里建议使用正则表达式来匹配
                {
                    Directory.Delete(fPath);
                }
                else
                {
                    DeleteDirectory(fPath);
                }
            }
            }
        }
    
    

    周雪峰
    2009年6月1日 10:38
    版主
  • 我从IL角度来说明这个问题:
    看如下代码:
                foreach (string d in Directory.GetFileSystemEntries(@"D:\a"))
                {
                }
    生成的IL代码为:
      .entrypoint
      // 代码大小       38 (0x26)
      .maxstack  2
      .locals init ([0] string d,
               [1] string[] CS$6$0000,
               [2] int32 CS$7$0001,
               [3] bool CS$4$0002)
      IL_0000:  nop
      IL_0001:  nop
      IL_0002:  ldstr      "D:\\a"
      IL_0007:  call       string[] [mscorlib]System.IO.Directory::GetFileSystemEntries(string)
      IL_000c:  stloc.1
      IL_000d:  ldc.i4.0
      IL_000e:  stloc.2
      IL_000f:  br.s       IL_001b
      IL_0011:  ldloc.1
      IL_0012:  ldloc.2
      IL_0013:  ldelem.ref
      IL_0014:  stloc.0
      IL_0015:  nop
      IL_0016:  nop
      IL_0017:  ldloc.2
      IL_0018:  ldc.i4.1
      IL_0019:  add
      IL_001a:  stloc.2
      IL_001b:  ldloc.2
      IL_001c:  ldloc.1
      IL_001d:  ldlen
      IL_001e:  conv.i4
      IL_001f:  clt
      IL_0021:  stloc.3
      IL_0022:  ldloc.3
      IL_0023:  brtrue.s   IL_0011
    从生成的IL代码可以看出,只调用了一次GetFileSystemEntries,并把结果保存在一个临时的string[]里了
    周雪峰
    2009年6月1日 13:39
    版主
  •         /// <summary>
            /// 删除文件
            /// </summary>
            /// <param name="dir">目录路径</param>
            /// <param name="delname">待删除文件或文件夹名称</param>
            public void DeleteFolder(string dir,string delname)
            {          
                if (Directory.Exists(dir))
                {
                    foreach (string d in Directory.GetFileSystemEntries(dir))
                    {
                        string tmpd = d.Substring(0, d.LastIndexOf("\\")) + "\\" + delname;
                        if (Directory.Exists(d))
                        {
                            if (d == tmpd)
                                Directory.Delete(d, true);
                            else
                                DeleteFolder(d, delname);//递归删除子文件夹  
                        }
                        else if(File.Exists(d))
                        {
                            if (d == tmpd)
                                File.Delete(d);
                        }
                    }
                }           
            }

    问一个性能方面的问题,你在foreah中直接使用了Directory.GetFileSystemEntries(dir)来匹配当前目录下的文件和目录,这样会不会在每次foreach的时候都调用到它?而是先使用一个数组来保存它的值,再来foreach?或者说.NET做过了这方面的编译优化。请高手给个解答。

    Promise you do it!

      foreach 在运行时 调用的是唯一的枚举器  枚举器是指定像一个固定资源的 而不是每次得到一个新枚举器和资源
    紫柔版主的头像真叫萌得一个不行啊。。。。
    2009年6月2日 3:09
    版主
  • 你自己的方法返回集合只有在foreach循环里才是只调用一次这个方法,这里foreach和for有很大的不同,你使用for的时候还是应该应用你过去的优化技巧的!
    foreach内部使用的是枚举器来实现的!所以只是在一开始的时候调用一次你的返回集合的方法,然后获取枚举器,以后就是在枚举器上进行遍历了!
    周雪峰
    2009年6月2日 5:24
    版主

全部回复

  •         /// <summary>
            /// 删除文件
            /// </summary>
            /// <param name="dir">目录路径</param>
            /// <param name="delname">待删除文件或文件夹名称</param>
            public void DeleteFolder(string dir,string delname)
            {          
                if (Directory.Exists(dir))
                {
                    foreach (string d in Directory.GetFileSystemEntries(dir))
                    {
                        string tmpd = d.Substring(0, d.LastIndexOf("\\")) + "\\" + delname;
                        if (Directory.Exists(d))
                        {
                            if (d == tmpd)
                                Directory.Delete(d, true);
                            else
                                DeleteFolder(d, delname);//递归删除子文件夹  
                        }
                        else if(File.Exists(d))
                        {
                            if (d == tmpd)
                                File.Delete(d);
                        }
                    }
                }           
            }

    2009年6月1日 8:38
  •    private void DeleteDirectory(string fParentPath)
        {
            foreach (string fPath in Directory.GetDirectories(fParentPath))
            {
                string fDirectoryName =(new  DirectoryInfo(fPath)).Name;
                if (fDirectoryName == "文件夹1" ||
                    fDirectoryName == "文件夹2" ||
                    fDirectoryName == "文件夹3")
                {
                    Directory.Delete(fPath);
                }
                else
                {
                    DeleteDirectory(fPath);
                }
            }
        }
    // 调用 DeleteDirectory(@"D:\test");
    知识改变命运,奋斗成就人生!
    2009年6月1日 8:42
    版主
  • 你好!
         我补充一下啊,如果你想删除某种类型的名字的文件夹,可以使用正则表达式来匹配文件名
    private void DeleteDirectory(string fParentPath)
        {
            if(Directory.Exists(fParentPath)//这里最好判断一下,以免发生异常
            {
            foreach (string fPath in Directory.GetDirectories(fParentPath))
            {
                string fDirectoryName =(new  DirectoryInfo(fPath)).Name;
                if (//这里建议使用正则表达式来匹配
                {
                    Directory.Delete(fPath);
                }
                else
                {
                    DeleteDirectory(fPath);
                }
            }
            }
        }
    
    

    周雪峰
    2009年6月1日 10:38
    版主
  •         /// <summary>
            /// 删除文件
            /// </summary>
            /// <param name="dir">目录路径</param>
            /// <param name="delname">待删除文件或文件夹名称</param>
            public void DeleteFolder(string dir,string delname)
            {          
                if (Directory.Exists(dir))
                {
                    foreach (string d in Directory.GetFileSystemEntries(dir))
                    {
                        string tmpd = d.Substring(0, d.LastIndexOf("\\")) + "\\" + delname;
                        if (Directory.Exists(d))
                        {
                            if (d == tmpd)
                                Directory.Delete(d, true);
                            else
                                DeleteFolder(d, delname);//递归删除子文件夹  
                        }
                        else if(File.Exists(d))
                        {
                            if (d == tmpd)
                                File.Delete(d);
                        }
                    }
                }           
            }

    问一个性能方面的问题,你在foreah中直接使用了Directory.GetFileSystemEntries(dir)来匹配当前目录下的文件和目录,这样会不会在每次foreach的时候都调用到它?而是先使用一个数组来保存它的值,再来foreach?或者说.NET做过了这方面的编译优化。请高手给个解答。

    Promise you do it!
    2009年6月1日 12:15
  • 我从IL角度来说明这个问题:
    看如下代码:
                foreach (string d in Directory.GetFileSystemEntries(@"D:\a"))
                {
                }
    生成的IL代码为:
      .entrypoint
      // 代码大小       38 (0x26)
      .maxstack  2
      .locals init ([0] string d,
               [1] string[] CS$6$0000,
               [2] int32 CS$7$0001,
               [3] bool CS$4$0002)
      IL_0000:  nop
      IL_0001:  nop
      IL_0002:  ldstr      "D:\\a"
      IL_0007:  call       string[] [mscorlib]System.IO.Directory::GetFileSystemEntries(string)
      IL_000c:  stloc.1
      IL_000d:  ldc.i4.0
      IL_000e:  stloc.2
      IL_000f:  br.s       IL_001b
      IL_0011:  ldloc.1
      IL_0012:  ldloc.2
      IL_0013:  ldelem.ref
      IL_0014:  stloc.0
      IL_0015:  nop
      IL_0016:  nop
      IL_0017:  ldloc.2
      IL_0018:  ldc.i4.1
      IL_0019:  add
      IL_001a:  stloc.2
      IL_001b:  ldloc.2
      IL_001c:  ldloc.1
      IL_001d:  ldlen
      IL_001e:  conv.i4
      IL_001f:  clt
      IL_0021:  stloc.3
      IL_0022:  ldloc.3
      IL_0023:  brtrue.s   IL_0011
    从生成的IL代码可以看出,只调用了一次GetFileSystemEntries,并把结果保存在一个临时的string[]里了
    周雪峰
    2009年6月1日 13:39
    版主
  •         /// <summary>
            /// 删除文件
            /// </summary>
            /// <param name="dir">目录路径</param>
            /// <param name="delname">待删除文件或文件夹名称</param>
            public void DeleteFolder(string dir,string delname)
            {          
                if (Directory.Exists(dir))
                {
                    foreach (string d in Directory.GetFileSystemEntries(dir))
                    {
                        string tmpd = d.Substring(0, d.LastIndexOf("\\")) + "\\" + delname;
                        if (Directory.Exists(d))
                        {
                            if (d == tmpd)
                                Directory.Delete(d, true);
                            else
                                DeleteFolder(d, delname);//递归删除子文件夹  
                        }
                        else if(File.Exists(d))
                        {
                            if (d == tmpd)
                                File.Delete(d);
                        }
                    }
                }           
            }

    问一个性能方面的问题,你在foreah中直接使用了Directory.GetFileSystemEntries(dir)来匹配当前目录下的文件和目录,这样会不会在每次foreach的时候都调用到它?而是先使用一个数组来保存它的值,再来foreach?或者说.NET做过了这方面的编译优化。请高手给个解答。

    Promise you do it!

      foreach 在运行时 调用的是唯一的枚举器  枚举器是指定像一个固定资源的 而不是每次得到一个新枚举器和资源
    紫柔版主的头像真叫萌得一个不行啊。。。。
    2009年6月2日 3:09
    版主
  • 这么说的话我以后都不用在循环的时候先保存集合到一个变量了?

    如果是我自己实现的一个方法,然后返回一个集合对象。那么在foreach或者for循环的时候,dotnet也会先把方法的值先拿出来,而不是每次调用吗?
    Promise you do it!
    2009年6月2日 4:20
  • 你自己的方法返回集合只有在foreach循环里才是只调用一次这个方法,这里foreach和for有很大的不同,你使用for的时候还是应该应用你过去的优化技巧的!
    foreach内部使用的是枚举器来实现的!所以只是在一开始的时候调用一次你的返回集合的方法,然后获取枚举器,以后就是在枚举器上进行遍历了!
    周雪峰
    2009年6月2日 5:24
    版主
  • 是的  .net  会准备一个引用暂时存储你的返回结果 然后取得这个结果的枚举器    后来foeach 仅仅调用这个枚举器, 枚举器只访问那临时引用中的内容。



    紫柔版主的头像真叫萌得一个不行啊。。。。

    2009年6月2日 5:26
    版主
  • 感谢斑竹真么精辟的回答,受益匪浅。


    Promise you do it!
    2009年6月2日 10:14
  • 不客气啊!
    欢迎常常来这里和大家交流啊!
    周雪峰
    2009年6月2日 11:18
    版主