最近我遇到的问题是我的硬盘驱动器已经变得令人讨厌,但在浏览了我的个人文件并删除/移动所有超大视频文件之后,我仍然有相当少量的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);
不幸的是,这并没有触及任何子目录。我已经查明了如何从子目录中获取文件,但是试图将这些代码片段与这个代码片段集成起来比我想象的更麻烦。在隧道尽头看到灯光的极少数情况下,我的程序会触及一个显然受管理员特权保护的目录(我是唯一的用户,因此也是我的计算机的管理员),并抛出像黑猩猩一样的错误动物园扔掉了粪便。
总的来说,我正在寻求帮助的是: -Program搜索我的计算机上的每个文件(我假设以“C:/”驱动器开头是我可以访问所有内容的地方) - 获取每个文件,其大小和该文件的路径,并将其抛出到列表/数组/其他任何内容 - 按文件大小从最大到最小排序 - 将此列表放入.txt文件
最后一部分我实际上并不需要帮助,因为我对Streamwriter类比较熟悉。如果文件/路径/大小的列表/数组/等都符合相同的模式并且可以转换为字符串,我甚至可以通过文件大小排序,使用准简单的解析算法来解决我的问题。因此,大约90.23%的问题只是获取所有文件,进入或忽略并继续使用受管理员保护的文件夹(我认为忽略它们将是最好的,因为我高度怀疑受保护文件夹中的任何内容都应该被删除。永远。)获取所有这些文件的路径和大小,并组织它们。
答案 0 :(得分: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);
}
答案 1 :(得分:5)
是否必须在c#中?从命令提示符处尝试:
dir c: /B /O-S /S /4 /a-d > fileList.txt
dir
命令列出文件,/ B删除一堆信息guff,/ OS按顺序显示文件(按(S)大小( - )降序,并且由于/ S而遍历所有子目录。 / 4位只是将文件年份设置为四位数,以防你有一些来自上个世纪,并且/ ad清除了目录列表。
答案 2 :(得分:1)
所以我让我的程序员大脑工作,并决定而不是仔细检查每个文件夹和&gt;子文件夹我自己并使用Windows的右键单击+属性功能来查看文件的大小和 无论值得保留,我都可以编写一个简单的代码来搜索我的&gt;上的每个文件。计算机,按其完整路径名将其放入列表中,并将其文件大小放在其旁边,然后对其进行排序 从文件大小到最小文件。
虽然这是一项有趣的编程练习,但如果您的目标是解决手头的问题,那么有一个很好的实用程序可以帮到您:WinDirStat