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

  • 本文关键字:使用 c# .net windows linq
  • 更新时间 :
  • 英文 :


我正在尝试列出我的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);

相关内容

  • 没有找到相关文章

最新更新