【问题标题】:Listing all files on my computer and sorting by size列出我电脑上的所有文件并按大小排序
【发布时间】:2012-10-10 23:03:30
【问题描述】:

最近我遇到了一个问题,我的硬盘驱动器变得令人讨厌,但是在浏览了我的个人文件并删除/移动了所有超大的视频文件之后,我仍然有相当少量的可用 ROM。所以我让我的程序员大脑开始工作,并决定不要自己仔细检查每个文件夹和子文件夹,而是使用 Windows 的右键单击 + 属性功能来查看文件有多大以及是否值得保留,我可以编写一个简单的代码来搜索我计算机上的每个文件,将其按完整路径名放入列表中,然后将其文件大小放在它旁边,然后按文件大小从大到小排序。 所以我跳到网上,开始做研究,就在那时,一切都为我着迷。我发现了大量适用于他们指定任务的代码 sn-ps,但每当我尝试自己使用它们时,我都会遇到大量的构建错误。也就是说,到目前为止,我发现的最有希望的是:

const string dir = "C:\\";
string[] fns = Directory.GetFiles(dir);
var Sort = from fn in fns
           orderby new FileInfo(fn).Length descending
           select fn;
foreach (string n in Sort)
    Console.WriteLine(n);

不幸的是,这并没有触及任何子目录。我已经查找了如何从子目录中获取文件,但是尝试将这些代码 sn-ps 与此代码集成证明比我想象的要麻烦得多。在隧道尽头看到光的罕见情况下,我的程序会触及一个明显受到管理员特权保护的目录(我是唯一的用户,因此是我的计算机的管理员)并像黑猩猩一样抛出错误动物园扔掉粪便。

所以总的来说,我正在寻求帮助的是: - 搜索我计算机上每个文件的程序(我假设从“C:/”驱动器开始是我可以访问所有内容的地方) - 获取每个文件、它的大小和该文件的路径,并将其扔到一个列表/数组/任何东西上 - 按文件大小从大到小排序 - 将此列表放入 .txt 文件中

最后一部分我实际上不需要帮助,因为我对 Streamwriter 类相当熟悉。如果我的文件/路径/大小的列表/数组/等都符合相同的模式并且可以转换为字符串,我什至可以使用准简单的解析算法按文件大小排序。因此,大约 90.23% 的问题只是获取所有文件,进入或忽略并继续受管理员保护的文件夹(我认为忽略它们是最好的,因为我非常怀疑受保护文件夹中的任何内容都应该被删除。永远。)获取所有这些文件的路径和大小,并组织它们。

【问题讨论】:

    标签: c# .net sorting directory filesize


    【解决方案1】:

    尝试另一个 GetFiles 重载:

    string[] fns = Directory.GetFiles(dir, "*", SearchOption.AllDirectories);
    

    如果你使用 EnumerateFiles 会更有效:

    const string dir = "C:\\";
    var Sort = Directory.EnumerateFiles(dir, "*", SearchOption.AllDirectories)
                        .OrderByDescending(f => new FileInfo(f).Length);
    foreach (string n in Sort)
    {
            Console.WriteLine(n);
    }
    

    为避免异常:

    const string dir = "C:\\";
    var fileInfos = new List<FileInfo>();
    GetFiles(new DirectoryInfo(dir), fileInfos);
    fileInfos.Sort((x, y) => y.Length.CompareTo(x.Length));
    foreach (var f in fileInfos)
    {
        Console.WriteLine(f.FullName);
    }
    
    private static void GetFiles(DirectoryInfo dirInfo, List<FileInfo> files)
    {
        // get all not-system subdirectories
        var subDirectories = dirInfo.EnumerateDirectories()
            .Where(d => (d.Attributes & FileAttributes.System) == 0);
        foreach (DirectoryInfo subdirInfo in subDirectories)
        {
            GetFiles(subdirInfo, files);
        }
        // ok, now we added files from all subdirectories
        // so add non-system files from this directory
        var filesInCurrentDirectory = dirInfo.EnumerateFiles()
            .Where(f => (f.Attributes & FileAttributes.System) == 0);
        files.AddRange(filesInCurrentDirectory);
    }
    

    【讨论】:

    • 这似乎是朝着正确方向迈出的一大步,但现在问题变成了未经授权的访问异常。我对 try-catch 方法有点熟悉,所以我添加了一个,但现在当它捕获 UnauthorizedAccessException 时,它会结束程序。
    • @Zach 嗯。尝试在 vs 之外以管理员身份运行生成的 .exe 文件
    • 在try-catch救了我之后,有没有办法让程序继续foreach语句?
    • 嗯,我知道这应该是如何工作的,但是带有 x 和 y 的部分给了我一个关于“无法转换 lambda 表达式”的错误,当谷歌搜索时,它变得更加混乱,然后听起来:(
    • @Zach,对不起,我错过了一些细节。现在好了。
    【解决方案2】:

    它必须在 c# 中吗?从命令提示符试试这个: dir c: /B /O-S /S /4 /a-d &gt; fileList.txt

    dir 命令列出文件,/B 删除一堆信息,/OS 按顺序(按 (S)Size (-) 降序显示文件,并通过 /S 遍历所有子目录。/4 bit 只是将文件的年份设置为四位数,以防您有上世纪的文件,并且 /ad 会清除目录列表。

    【讨论】:

    • 这确实做到了你所说的,但文件列表相当庞大,包含子目录本身的路径,而不仅仅是其中的文件,并且无法对整个项目列表进行排序按文件大小,而是按每个子目录的大小。很有帮助,如果我的整个努力都失败了,可能是首选,但不是我想要的。不过,我非常感谢您的帮助:)
    • 列表的庞大我无能为力 - 这就是令人讨厌的完整磁盘发生的情况:)。添加/a-d 以从列表中删除目录和子目录。我很抱歉它没有正确排序,我认为它会。也许当您添加 /a 选项时。干杯
    • 这确实有帮助 =) 非常感谢
    【解决方案3】:

    所以我让我的程序员大脑开始工作,并决定不要自己仔细检查每个文件夹和 > 子文件夹,而是使用 Windows 的右键单击 + 属性功能来查看文件的大小和 无论它是否值得保留,我都可以编写一个简单的代码来搜索我 > 计算机上的每个文件,将其按完整路径名放入列表中,并将其文件大小放在它旁边,然后对其进行排序 按文件大小从大到小。

    虽然这是一个有趣的编程练习,但如果您的目标是解决手头的问题,那么有一个不错的实用程序可以为您完成此任务:WinDirStat

    【讨论】:

    • 感谢您提供该实用程序的链接。这个问题还不够严重,我不想下载任何东西来修复它(而且,了解我,把它搞砸了),我在很大程度上确实决定这样做以获得编程经验:)
    猜你喜欢
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2022-09-06
    • 2011-11-19
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2010-12-25
    相关资源
    最近更新 更多