【发布时间】:2013-12-12 12:56:46
【问题描述】:
我真的是 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:\ 的垃圾桶时会发生错误,但即使它跳过这个特定位置,错误仍然会在另一个无法访问的位置返回。
我希望这里的任何人都知道一个很好的例子或知道解释这一点的网站。
【问题讨论】:
-
需要记住的几件事:1) 您将无法访问某些操作系统目录,这些目录只允许操作系统本身访问,而不允许任何其他用户帐户访问,所以这可能是原因。 2)如果您正在查看网络目录,您的帐户可能没有访问它们的权限,这也是原因。 3) 如果您在 ASP.NET/MVC 中使用此代码,则它在应用程序池帐户下运行,并且可能是目录没有添加允许的用户帐户。你也没有在你的代码中指定你开始的初始路径
-
@Ahmedilyas 我在问题中添加了更多信息。我希望这更清楚一点。
-
谢谢。那么你能告诉我们有问题的文件夹在遍历目录时会引发什么错误吗?同样,正如我所说,有些文件夹即使作为管理员也无法访问,因为它们是操作系统文件夹/文件或通过另一个程序专门为另一个用户帐户锁定,无论您是否是管理员
-
@Ahmedilyas 在这种情况下,它是 D:\ 驱动器的垃圾桶。我听说过仅限操作系统的文件夹。未经授权的异常确实阻止了它们。但这就是为什么我写了关于
SearchOption.AllDirectories的那部分。因为如果我删除它,代码就可以工作。但是如果我删除它,它看起来就没有任何子目录。
标签: c# console-application .net