Что самый быстрый путь состоит в том, чтобы вычислить размер папок Windows?

Я должен вычислить размер сотен папок, некоторые будут 10 МБ некоторые, возможно, 10 ГБ, мне нужен супер быстрый способ получить размер каждой папки с помощью C#.

Мой конечный результат, надо надеяться, будет:

Folder1 10.5 ГБ

Folder2 230 МБ

Folder3 1.2 ГБ

...

19
задан John Saunders 19 May 2010 в 21:48
поделиться

6 ответов

В .Net нет простого способа сделать это; вам придется перебирать все файлы и поддиректории. Смотрите примеры здесь, чтобы увидеть, как это делается.

2
ответ дан 30 November 2019 в 02:29
поделиться

Хорошо, это ужасно, но ...

Используйте рекурсивный пакетный файл dos с именем dirsize.bat:

@ECHO OFF
IF %1x==x GOTO start
IF %1x==DODIRx GOTO dodir
SET CURDIR=%1
FOR /F "usebackq delims=" %%A IN (`%0 DODIR`) DO SET ANSWER=%%A %CURDIR%
ECHO %ANSWER%
GOTO end
:start
FOR /D %%D IN (*.*) DO CALL %0 "%%D"
GOTO end
:dodir
DIR /S/-C %CURDIR% | FIND "File(s)"
GOTO end
:end

Примечание: после последнего "%% A" в строке 5 должен быть символ табуляции, не пробелы.

Это данные, которые вы ищете. Он довольно быстро обработает тысячи файлов. Фактически, он обрабатывает весь мой жесткий диск менее чем за 2 секунды.

Выполнить файл, подобный этому dirsize | sort / R / + 25 , чтобы увидеть самый большой каталог в списке первым.

Удачи.

13
ответ дан 30 November 2019 в 02:29
поделиться

Если вы щелкнете правой кнопкой мыши по большому каталогу, то в свойствах вы увидите, что для расчета размера требуется значительное количество времени ... Я не думаю, что мы можем победить MS в этом. Одна вещь, которую вы можете сделать, - это проиндексировать размеры каталогов / подкаталогов, если вы собираетесь вычислять их снова и снова ... это значительно увеличит скорость.

Вы можете использовать что-то вроде этого для рекурсивного вычисления размера каталога в C #

static long DirSize(DirectoryInfo directory)
{
    long size = 0;

    FileInfo[] files = directory.GetFiles();
    foreach (FileInfo file in files)
    {
        size += file.Length;
    }

    DirectoryInfo[] dirs = directory.GetDirectories();

    foreach (DirectoryInfo dir in dirs)
    {
        size += DirSize(dir);
    }

    return size;
}
1
ответ дан 30 November 2019 в 02:29
поделиться

Вы можете сделать что-то подобное, но нет настройки fast = true, когда дело доходит до получения размеров папок, вам нужно сложить размеры файлов.

    private static IDictionary<string, long> folderSizes;

    public static long GetDirectorySize(string dirName)
    {
        // use memoization to keep from doing unnecessary work
        if (folderSizes.ContainsKey(dirName))
        {
            return folderSizes[dirName];
        }

        string[] a = Directory.GetFiles(dirName, "*.*");

        long b = 0;
        foreach (string name in a)
        {
            FileInfo info = new FileInfo(name);
            b += info.Length;
        }

        // recurse on all the directories in current directory
        foreach (string d in Directory.GetDirectories(dirName))
        {
            b += GetDirectorySize(d);
        }

        folderSizes[dirName] = b;
        return b;
    }

    static void Main(string[] args)
    {
        folderSizes = new Dictionary<string, long>();
        GetDirectorySize(@"c:\StartingFolder");
        foreach (string key in folderSizes.Keys)
        {
            Console.WriteLine("dirName = " + key + " dirSize = " + folderSizes[key]);
        }

        // now folderSizes will contain a key for each directory (starting
        // at c:\StartingFolder and including all subdirectories), and
        // the dictionary value will be the folder size
    }
1
ответ дан 30 November 2019 в 02:29
поделиться

Dot Net Pearls имеет метод, аналогичный описанному здесь. Удивительно, что у класса System.IO.DirectoryInfo нет метода для этого, поскольку это кажется общей потребностью, и, вероятно, было бы быстрее сделать это, не выполняя собственный / управляемый переход для каждого объект файловой системы. Я действительно думаю, что если скорость является ключевым моментом, напишите неуправляемый объект для выполнения этого вычисления, а затем вызовите его один раз для каждого каталога из управляемого кода.

1
ответ дан 30 November 2019 в 02:29
поделиться

В этой ссылке (хотя и на Python) есть несколько зацепок от человека, столкнувшегося с аналогичными проблемами производительности.Вы можете попробовать позвонить в Win32 API , чтобы узнать, улучшится ли производительность, но в конце вы столкнетесь с той же проблемой: задача может быть выполнена только так быстро, и если вам нужно выполнить задача много раз, это займет много времени. Не могли бы вы подробнее рассказать, для чего вы это делаете? Это может помочь людям придумать эвристику или некоторые читы, которые помогут вам. Если вы много делаете этот расчет, кешируете ли вы результаты?

0
ответ дан 30 November 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: