以递归方式获取目录的大小 - C.

时间:2016-09-02 20:09:03

标签: c recursion directory size

我试图以递归方式获取目录的大小,但我只得到段错误。我真的无法看到我错在哪里,有人可以帮助我吗? 附:我不需要验证文件是否存在,这只是我必须编写的另一个函数的尝试。

以下是代码:

$(function() {
    $(window).scroll(function() {
        if($(window).scrollTop() > $(".b").offset().top+$(".b").height()){
            $(".sticky").show();
        }else{
            $(".sticky").hide();
        }
    });
});

2 个答案:

答案 0 :(得分:0)

在您的代码的基础上,以下是我能够重现du -sk返回的最接近的代码:

#include <stdio.h>
#include <sys/stat.h>
#include <dirent.h>
#include <limits.h>
#include <string.h>

off_t directorySize(char *directory_name)
{
    off_t directory_size = 0;

    DIR *pDir;

    if ((pDir = opendir(directory_name)) != NULL)
    {
        struct dirent *pDirent;

        while ((pDirent = readdir(pDir)) != NULL)
        {
            char buffer[PATH_MAX + 1];

            strcat(strcat(strcpy(buffer, directory_name), "/"), pDirent->d_name);

            struct stat file_stat;

            if (stat(buffer, &file_stat) == 0)
            {
                directory_size += file_stat.st_blocks * S_BLKSIZE;
            }

            if (pDirent->d_type == DT_DIR)
            {
                if (strcmp(pDirent->d_name, ".") != 0 && strcmp(pDirent->d_name, "..") != 0)
                {
                    directory_size += directorySize(buffer);
                }
            }
        }

        (void) closedir(pDir);
    }

    return directory_size;
}

int main(int argc, char *argv[])
{
    printf("%lldKiB\n", directorySize(argv[1]) / 1024);

    return 0;
}

我猜你所看到的差异是由于目录消耗了少量空间而需要包含在你的总数中,并且文件空间的使用是分块的,所以你需要计算块,而不是字节。

答案 1 :(得分:0)

经过一个晚上的努力尝试如何找到一个安静的大小与du -sh报告的相同:我写了这个并且它似乎也适用于大型目录(例如750 GB或更多的linux源代码) )。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <dirent.h>
#include <stdlib.h>
#include <limits.h>

long folder_size(char *);

int main(int argc, char * argv[])
{
  if (argc < 2)
  {
    exit(1);
  }
  printf("%ld\n", mysize(argv[1]));
  return 0;
}

int not_folder(char * path)
{
    struct stat path_stat;
    stat(path, &path_stat);
    return (S_ISREG(path_stat.st_mode));
}

long folder_size(char * name)
{
  long dir_size = 0L;
  struct dirent * pDirent;
  DIR * pDir = opendir(name);
  while ((pDirent = readdir(pDir)))
  {
    if (strcmp (pDirent->d_name, "..") != 0 && strcmp (pDirent->d_name, ".") != 0)
    {
      char buf[PATH_MAX];
      strcpy(buf, name);
      strcat(buf, "/");
      strcat(buf, pDirent->d_name);
      if (not_folder(buf))
      {
        struct stat st;
        stat(buf, &st);
        dir_size += st.st_blocks * S_BLKSIZE;
        printf("%s %ld\n", buf, (long)st.st_size);
      }
      else
      {
        dir_size += folder_size(buf);
      }
    }
  }
  (void) closedir(pDir);
  return dir_size;
}