5

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

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);

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

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

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

4

3 回答 3

6

尝试另一个 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);
}
于 2012-10-20T14:27:51.357 回答
5

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

dir命令列出文件,/B 删除一堆信息,/OS 按顺序显示文件(按 (S)Size (-) 降序并通过 /S 导致的所有子目录。/4 位仅设置年份如果您有一些上世纪的文件,则将文件保存到四位数,并且 /ad 会清除目录列表。

于 2012-10-20T14:31:23.520 回答
1

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

While this is a fun programming exercise, if your goal is to solve the problem at hand, there is a nice utility that will do this for you: WinDirStat

于 2012-10-20T19:39:25.050 回答