我正在尝试列出我的c驱动器的所有文件夹,不包括我似乎无法访问的文档文件夹。 这对我来说似乎很简单,但我发现自己仍然在努力,尽管看起来很丰富 .net 库。
我无法发布任何代码,因为我到目前为止尝试过的代码并没有真正起作用。
希望有人能提出一些建议。
这里有一个小例子:
class DirectorySize
{
public string DirectoryName;
public long DirectorySizes;
}
public class Program
{
static void Main(string[] args)
{
string[] cDirectories = Directory.GetDirectories("C:\");
List<DirectorySize> listSizes = new List<DirectorySize>();
for (int i = 0; i < cDirectories.Length; i++)
{
long size = GetDirectorySize(cDirectories[i]);
if(size != -1)
{
listSizes.Add(new DirectorySize() { DirectoryName = cDirectories[i], DirectorySizes = size });
}
}
}
private static long GetDirectorySize(string folderPath)
{
try
{
DirectoryInfo di = new DirectoryInfo(folderPath);
return di.EnumerateFiles("*", SearchOption.AllDirectories).Sum(fi => fi.Length);
}
catch
{
// If you get Access denied error handle it here
return -1;
}
}
}
执行此操作的另一种方法是实现 LINQ 扩展方法(无耻地从这个问题的最高答案中窃取:
public static class Extensions
{
public static IEnumerable<T> SkipExceptions<T>(this IEnumerable<T> values)
{
using (var enumerator = values.GetEnumerator())
{
bool next = true;
while (next)
{
try
{
next = enumerator.MoveNext();
}
catch
{
continue;
}
if (next) yield return enumerator.Current;
}
}
}
}
然后,可以按如下所示运行枚举器:
DirectoryInfo di = new DirectoryInfo(@"C:");
var size =
di.EnumerateFiles("*", SearchOption.AllDirectories)
.SkipExceptions()
.Sum(fi => fi.Length);