如何使用递归获得C中文件夹的总大小?

Lor*_*uel 2 c directory size recursion stat

所有文件夹的大小均为4096 B.

如何获取包含所有文件大小的文件夹的总大小?

例如:

> Dir1 (4096)
> -- File1.txt (100)
> -- Dir 2 (4096)
> ---- File2.txt (100)
Run Code Online (Sandbox Code Playgroud)

当我试图获得Dir1的大小时,它给了我4096.我希望得到的预期答案是8392

另一个例子:

DirA (4096)
-- FileA (100)
-- FileB (100)
Run Code Online (Sandbox Code Playgroud)

总数应为4296

我试图找出算法,但我找不到一种方法来检测它是否是一个文件夹.对不起下面的"粗俗"代码......

DIR *dir;
struct dirent *dp;
struct stat fileStat;
    int getTotalDirSize()
    {
        while()
        {
            if(/*Detect Folder/Directory*/)
            {
            totalSize += 4096;
                getTotalDirSize();
            }
            else
            {
                totalSize += fileSize;
            }

        }

        return totalSize;
    }
Run Code Online (Sandbox Code Playgroud)

注意:我使用struct stat来获取大小和文件/文件夹名称.

小智 5

它使用stat工作,但只有你必须做的是提供完整的统计路径,如你的例子Dir1-> 4096B然后如果你想知道File1.txtstat中使用的大小,如下所示:

strcpy(str,Dir1);   //str is a string
strcat(str,"/");
strcat(str,filename);
Run Code Online (Sandbox Code Playgroud)

然后str在stat中使用以获取该文件的大小.我想在这里你必须使用dirent结构和DIR作为文件夹及其内容.

为了找到文件夹中使用d_type = 4的dirent结构的指针.对于递归操作,将所有内容放在一个单独的函数中并递归调用它直到文件夹搜索完成.

struct stat buf;
DIR *dptr;
struct dirent *sdir;
int size=0;
char str[100];

dptr=opendir(folder);
while(sdir=readdir(dptr))
{
    if(sdir->d_type==4)
    {
        if(sdir->d_name[0]!='.')
        {
            stat(sdir->d_name,&buf);
            size=buf.st_size;
            pf("size=%d\n",size);
        }
    }
    else
    {
        strcpy(str,folder);
        strcat(str,"/");
        strcat(str,sdir->d_name);
        stat(str,&buf);
        size+=buf.st_size;
        pf("size=%d\n",size);
    }
}
Run Code Online (Sandbox Code Playgroud)