我是C#的新手,所以我一直在做一个小宠物项目。
我创建了一个小程序,用于比较给定大小的目录大小。如果目录相等或更大,则它会记录该目录的路径。
long size = Convert.ToInt32(Size) * 1024 * 1024;
string[] directories = Directory.GetDirectories(path, "*", SearchOption.AllDirectories); //the error occurs on this line
Array.Sort(directories);
foreach (string name in directories)
try
{
DirectoryInfo directory = new DirectoryInfo(name);
long dir = directory.EnumerateFiles("*", SearchOption.AllDirectories).Sum(fi => fi.Length);
if (dir >= ScanSize)
Console.WriteLine(directory);
}
catch (UnauthorizedAccessException) { }
我应该注意输入字符串和long size = Convert.ToInt32(Size)
来自Main()
我读过一些我不应该使用
的地方 Directory.GetDirectories(ScanPath, "*", SearchOption.AllDirectories);
因为它会立刻获得所有目录。但是如果我删除它,它只获取给定路径中的目录,没有任何子目录。所以我被告知应用递归,但我发现这些相当困难。我在file.Attributes
上阅读了一些关于隐藏文件的内容,但我不知道在哪里应用它们。
我是系统的管理员,我打算在整个数据驱动器上运行它。 D:\
但是在这种情况下,当程序试图访问D:\的垃圾桶时会发生错误。但即使它跳过这个特定位置,错误仍会在另一个无法访问的位置返回。
我希望这里的任何人都知道一个很好的例子,或者知道一个解释这个问题的网站。
答案 0 :(得分:0)
递归是你的朋友。在循环中根据需要添加错误处理。试试这个:
private static long maxSize = 5 * 1024 * 1024;
static void Main(string[] args)
{
GetDirectorySize(new DirectoryInfo(@"d:\"));
}
static long GetDirectorySize(DirectoryInfo dir)
{
long size = 0;
foreach(DirectoryInfo d in dir.EnumerateDirectories("*",SearchOption.TopDirectoryOnly)) {
size += GetDirectorySize(d);
}
size += dir.EnumerateFiles("*",SearchOption.TopDirectoryOnly).Sum(fi => fi.Length);
if (size > maxSize)
{
Console.WriteLine("Directory: {0} Size: {1}", dir, size);
}
return size;
}