C#控制台程序删除空文件夹漏掉了中文名称的文件夹

X.D.Washington 2019-11-05 01:14:26
我的电脑硬盘被我分成了三个区(C盘、D盘和E盘),C盘用来装系统程序和文件,D盘用来装系统程序以外的所有其他程序和文件,E盘用来装普通文件。D盘在使用的时候会有如下需要:我下载一个游戏体验版,玩完之后卸载该游戏,但是游戏本身没有把自身在D盘下的总目录删掉。这种需要删除空文件夹的情况经常发生(不限于玩游戏,有时候我会临时建立一些空文件夹测试一些程序,测试完之后也需要删除这些空文件夹)。

于是我编写了一个C#控制台程序,以下是全部源代码:
using System;
using System.IO;

class Test
{
public static void Main()
{
try
{
// 获取D盘下的所有文件夹作为变量。不包括子文件夹和文件。
string[] dirs = Directory.GetDirectories(@"D:\", "*", SearchOption.TopDirectoryOnly);

// 在删除操作之前先列出所有文件夹。
Console.WriteLine("The number of directories is {0}.", dirs.Length);
foreach (string dir in dirs)
{
Console.WriteLine(dir);
}
Console.WriteLine("\n");

// 删除D盘下的空文件夹。
foreach (string dir in dirs)
{
System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(dir);
// 判断文件夹是否为空文件夹。
if(di.GetFiles().Length + di.GetDirectories().Length == 0)
{
Directory.Delete(dir);
Console.WriteLine("Deleted: {0}", dir);
}
}
}
catch (Exception e)
{
Console.WriteLine("\n");
Console.WriteLine("The process failed: {0}", e.ToString());
}

Console.ReadKey();
}
}

在测试该代码的时候,我的D盘目录如下:


图1 程序运行前的D盘目录结构


其中“empty1”、“empty2”、“empty3”以及“新建文件夹”、“新建文件夹(2)”......“新建文件夹(8)”这些文件夹是建立来测试该控制台程序的空文件夹。该控制台程序的目的就是删除这些空文件夹(不删除非空文件夹)。

程序运行结果如下:


图2 控制台程序运行结果


可以看到程序运行结果中,程序删除了“empty1”、“empty2”、“empty3”这三个文件夹,但是其它包含中文(和中文括号)的非空文件夹并未删除。


图3 程序运行后的D盘目录结构


这不是我想要的结果,但是程序就是这么运行的。一定是代码哪里出问题了。我自己看了半天看不出来,还请大佬们指点。
还有一个问题就是如何避开系统文件夹(比如控制台输出里的“System Volume Information“”),也请大佬们出个主意,最好能给出示例代码或者相关资料的网站。跪谢!
...全文
75 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
X.D.Washington 2019-11-05
  • 打赏
  • 举报
回复
引用 1 楼 hztltgg 的回复:
和中文没关系,只是遇到System Volume Information文件夹抛异常了,后面的没执行而已。 System Volume Information文件夹是保存系统还原一些内容的,正常没有权限删除,也别想着强制删除了,你可以判断是否隐藏文件,跳过删除。
感谢大佬! 我按您说的在源码中加入了一段判断文件夹属性的代码:
using System;
using System.IO;

class Test
{
    public static void Main()
    {
        try
        {
            // 获取D盘下的所有文件夹作为变量。不包括子文件夹和文件。
            string[] dirs = Directory.GetDirectories(@"D:\", "*", SearchOption.TopDirectoryOnly);

            // 在删除操作之前先列出所有文件夹。
            Console.WriteLine("The number of directories is {0}.", dirs.Length);
            foreach (string dir in dirs)
            {
                Console.WriteLine(dir);
            }
            Console.WriteLine("\n");

            // 删除D盘下的空文件夹。
            foreach (string dir in dirs)
            {
                // 判断是否为隐藏的系统文件夹或者具有只读属性。
                FileAttributes attributes = File.GetAttributes(dir);
                if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden ||
                    (attributes & FileAttributes.System) == FileAttributes.System ||
                    (attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
                {
                    Console.WriteLine(dir + "--------" + attributes);
                }
                else
                {
                    DirectoryInfo di = new System.IO.DirectoryInfo(dir);

                    // 判断文件夹是否为空文件夹。
                    if (di.GetFiles().Length + di.GetDirectories().Length == 0)
                    {
                        Directory.Delete(dir);
                        Console.WriteLine("Deleted: {0}", dir);
                    }
                }
            }
        }
        catch (UnauthorizedAccessException e)
        {
            Console.WriteLine("\n");
            Console.WriteLine("The process failed: {0}", e.ToString());
        }

        Console.ReadKey();
    }
}
程序完美运行!
图2-2 加入判断文件夹隐藏属性的代码后的运行结果
再次感谢大佬!
hztltgg 2019-11-05
  • 打赏
  • 举报
回复
和中文没关系,只是遇到System Volume Information文件夹抛异常了,后面的没执行而已。 System Volume Information文件夹是保存系统还原一些内容的,正常没有权限删除,也别想着强制删除了,你可以判断是否隐藏文件,跳过删除。

110,534

社区成员

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

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

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