【问题标题】:Finding the size of a directory查找目录的大小
【发布时间】:2011-12-02 02:05:11
【问题描述】:

我在一次 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++;
            }
        }
    }
}

【问题讨论】:

    标签: algorithm file recursion directory


    【解决方案1】:

    使用 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);
    }
    

    这是以前发布的Fastest ways to get a directory Size and Size on disk。典型输出:

    Total size: 28433001733
    In 878794 files and 87047 directories (73318 symlinks and 0 inaccessible directories)
    Size on disk 59942192 * 512b = 30690402304
    

    【讨论】:

    【解决方案2】:

    可能会为大型文件集和更好的子目录导航增加更多空间。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 2016-02-16
      • 2013-12-14
      • 2011-01-26
      • 1970-01-01
      相关资源
      最近更新 更多