Нахождение размера каталога - PullRequest
2 голосов
/ 06 октября 2011

Я получил этот вопрос в интервью Cisco: написать функцию для определения размера каталога?

Ниже приводится псевдокод для такой функции, которая следует рекурсивному подходу. Пожалуйста, скажите мне, если есть какой-то другой подход.

int directorySize(DirectoryHandle dh)
{
    int size=0;
    if (!dh)
    {
        DirectoryHandle dh1 = directoryOpen("Directory_path");
    }
    else
    {
        dh1 = dh;
    }

    while (dh1)
    {
        if (TRUE=IsDirectory(dh1))
        {
            size += directorysize(dh1);
        }
        else if (TRUE == IsFile(dh1))
        {
            FileHandle fh = dh1;
            while (EOF != fh)
            {
                size++;
            }
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 06 октября 2011

Канонический пример использования nftw:

Обратите внимание, что по ходу вопросов об интервью они, вероятно, захотят, чтобы вы подумали о

  • порядке обхода
  • разрешения (недоступная подпапка и т.д.

Следующий код прагматично решает большинство из этих проблем:

.

#define _XOPEN_SOURCE 500
#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

static uintmax_t total        = 0ul;
static uintmax_t files        = 0ul;
static uintmax_t directories  = 0ul;
static uintmax_t symlinks     = 0ul;
static uintmax_t inaccessible = 0ul;
static uintmax_t blocks512    = 0ul;

static int
display_info(const char *fpath, const struct stat *sb,
             int tflag, struct FTW *ftwbuf)
{
    switch(tflag)
    {
        case FTW_D:
        case FTW_DP:  directories++;  break;
        case FTW_NS:
        case FTW_SL:
        case FTW_SLN: symlinks++;     break;
        case FTW_DNR: inaccessible++; break;
        case FTW_F:   files++;        break;
    }
    total += sb->st_size;
    blocks512 += sb->st_blocks;
    return 0; /* To tell nftw() to continue */
}

int
main(int argc, char *argv[])
{
    int flags = FTW_DEPTH | FTW_MOUNT | FTW_PHYS;

    if (nftw((argc < 2) ? "." : argv[1], display_info, 20, flags) == -1)
    {
        perror("nftw");
        exit(EXIT_FAILURE);
    }

    printf("Total size: %7jd\n", total);
    printf("In %jd files and %jd directories (%jd symlinks and %jd inaccessible directories)\n", files, directories, symlinks, inaccessible);
    printf("Size on disk %jd * 512b = %jd\n", blocks512, blocks512<<9);

    exit(EXIT_SUCCESS);
}

Это сообщение опубликовано как Самый быстрый способ получитьРазмер каталога и Размер на диске до.Типичный вывод:

Total size: 28433001733
In 878794 files and 87047 directories (73318 symlinks and 0 inaccessible directories)
Size on disk 59942192 * 512b = 30690402304
1 голос
/ 06 октября 2011

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

long DirectoryLength(DirectoryInfo dir)
{
    long size = 0;
    foreach (FileInfo file in dir.GetFiles())
        size += file.Length;

    foreach (DirectoryInfo sub in dir.GetDirectories())
        size += DirectoryLength(sub);

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