Сортировка всех файлов и папок по размеру C # - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь написать код, который сортирует все файлы и папки в системе по размеру и помещает его в текстовый файл.Например:

/Users: 25Gb
    /Users/me: 20Gb
        /Users/me/films: 11Gb
            /Users/me/films/Shrek.mkv 6Gb
            /Users/me/films/Shrek2.mkv 5Gb
        /Users/me/Documents: 9Gb
            /Users/me/Documents: myBigFile.rar 5Gb
            /Users/me/Documents: mySmallerFile.rar 4Gb
    /Users/mum: 5Gb
        /Users/mum/documents: 5Gb
            /Users/mum/documents: mumsFile.zip 5Gb

Вы получаете изображение - Папки, отсортированные по размеру, и все их подпапки / файлы, также отсортированные по файлам (возможно, с отступами, как указано выше).Пока мой код (ниже) получает все файлы из всех папок в моих загрузках и сортирует их, а затем помещает общий размер в конец файла.Кто-нибудь знает, куда я могу пойти отсюда?Спасибо!

static void ProcessDirectory(string writeTo, string inPath)
    {
        var Sort = Directory.EnumerateFiles(inPath, "*", SearchOption.AllDirectories)
                            .OrderByDescending(f => new FileInfo(f).Length);

        long b = 0;
        TextWriter tw = new StreamWriter(writeTo, true);

        foreach (string name in Sort)
        {

            FileInfo info = new FileInfo(name);
            long len = info.Length;
            tw.WriteLine(name + ": " + len);
            b += info.Length;
            }


        tw.WriteLine(b);
        tw.Close();
        // 4.
        // Return total size
    }

    static void Main(string[] args)
    {
        string outPath = @"/Users/a/Documents/size.txt";
        TextWriter tw = new StreamWriter(outPath, true); //This must come first to create the file

        ProcessDirectory(outPath, @"/Users/a/Downloads");
        tw.Close();
    }

1 Ответ

0 голосов
/ 25 ноября 2018

Это может вас где-то получить

Дано

public static class MyExtension
{
    static readonly string[] _sizeSuffixes ={ "bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };

    public static string ToSize(this long value, int decimalPlaces = 1)
    {
        if (value < 0) { return "-" + ToSize(-value); }

        var i = 0;
        var dValue = (decimal)value;
        while (Math.Round(dValue, decimalPlaces) >= 1000)
        {
            dValue /= 1024;
            i++;
        }

        return string.Format("{0:n" + decimalPlaces + "} {1}", dValue, _sizeSuffixes[i]);
    }
}

Класс

public class Info
{
    public Info(DirectoryInfo directoryInfo)
    {
        DirectoryInfo = directoryInfo;
        Name = directoryInfo.FullName;
    }
    public Info(FileInfo fileInfo)
    {
        Name = fileInfo.FullName;
        Size = fileInfo.Length;
    }
    public DirectoryInfo DirectoryInfo { get; }
    public string Name { get; set; }

    public long Size { get; set; }
    public List<Info> Children { get; set; } = new List<Info>();
    public List<Info> GetDirectories()
    {
        if (DirectoryInfo == null) return Children;

        var dirs = DirectoryInfo.EnumerateDirectories()
                                .Select(x => new Info(x))
                                .ToList();
        Children = dirs;
        Children.AddRange(DirectoryInfo.EnumerateFiles().Select(x => new Info(x)));
        return dirs;
    }


    public void Order()
    {
        if (Children == null) return;
        Children = Children.OrderBy(x => x.Children == null).ThenByDescending(x => x.Size).ToList();
        Children.ForEach(c => c.Order());
    }

    public void Sum() => Size = Children?.Sum(x => x.Size) ?? 0;

    public void WriteResults(StreamWriter fs, int level =0)
    {
        fs.WriteLine($"{new string(' ', level)}{Name} {Size.ToSize(3)}");
        level++;
        if (Children == null) return;
        foreach (var info in Children)
            info.WriteResults(fs, level);
    }
}

Использование

public static void Main(string[] args)
{
    var info = ProcessDirectory(new DirectoryInfo(@"D:\"));

    using (var fs = new FileStream(@"D:\Reuslts.txt", FileMode.Create))
    {
        using (var sw = new StreamWriter(fs))
        {
            info.Sum();
            info.Order();
            info.WriteResults(sw);
        }
    }
}

private static Info ProcessDirectory(DirectoryInfo directoryInfo)
{
    var baseInfo = new Info(directoryInfo);
    var queue = new Queue<Info>();
    queue.Enqueue(baseInfo);

    while (queue.Count>0) 
    {
        try
        {
            var info = queue.Dequeue();
            foreach (var dir in info.GetDirectories())
                queue.Enqueue(dir);
        }
        catch (UnauthorizedAccessException e) { }
    }

    return baseInfo;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...