使用C#按内容大小列出目录

时间:2015-06-15 11:59:07

标签: c# .net windows linq

我正在尝试列出我的c驱动器的所有文件夹,不包括我似乎无法访问的文档文件夹。这首先对我来说似乎相当简单,但我发现自己仍然在努力解决它,尽管看似丰富的.net库。

我无法发布任何代码,因为到目前为止我所尝试的并不真正有用。

希望有人会提出建议。

2 个答案:

答案 0 :(得分:1)

这里有一个小例子:

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

答案 1 :(得分:0)

另一种方法是实现LINQ扩展方法(从this question的最佳答案中无耻地窃取:

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