gpt4 book ai didi

c - 递归获取目录的大小 - C

转载 作者:行者123 更新时间:2023-11-30 16:57:49 26 4
gpt4 key购买 nike

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

代码如下:

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

int main(int argc, char * argv[])
{
printf("%d\n", size(argv[1]));
return 0;
}

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

int size(char * name)
{
int dir_size = 0;
struct dirent * pDirent;
DIR * pDir = opendir(name);
while ((pDirent = readdir(pDir)) != NULL)
{
char buf[PATH_MAX + 1];
realpath(pDirent->d_name, buf);
if (is_folder(buf))
{
size(buf);
}
else
{
struct stat st;
stat(buf, &st);
int sz = st.st_size;
dir_size += sz;
}
}
return dir_size;
}

最佳答案

基于您的代码,下面是我能够重现 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;
}

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

关于c - 递归获取目录的大小 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39300029/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com