gpt4 book ai didi

c - 尝试打印目录和所有子目录中以字节为单位的总空间

转载 作者:行者123 更新时间:2023-12-04 12:00:41 24 4
gpt4 key购买 nike

我目前正在尝试制作一个 c 程序来计算给定目录的总文件大小(以字节为单位),包括目录本身、其中的所有文件以及所有子目录中的所有文件和目录。本质上,我被要求编写一个替换 du -b 的命令。

我以为我有一个可行的解决方案,但在第一个目录之后,该程序认为所有更深层次的条目都是目录,即使它们只是常规文件也是如此。这包括当我直接给它一个更深一层的目录时,比如给它输入 ./Directory1 而不仅仅是 ..

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

int du_function(char direc[]) {
int total = 0;
char str[100];
strcpy(str, direc);
struct stat sfile;
struct dirent *de;
DIR *dr = opendir(direc);
if (dr == NULL) {
printf("Could not open directory\n");
return 0;
}
while ((de = readdir(dr)) != NULL) {
printf("%s\n", de->d_name);
stat(de->d_name, &sfile);
if (S_ISDIR(sfile.st_mode) && strcmp(de->d_name, ".") != 0 &&
strcmp(de->d_name, "..") != 0) {
strcat(str, "/");
strcat(str, de->d_name);
printf("This is a directory called %s\n", str);
total = total + du_function(str);
strcpy(str, direc);
}
if (S_ISREG(sfile.st_mode) || strcmp(de->d_name, ".") == 0) {
printf("Size in bytes = %ld\n", sfile.st_size);
total = total + sfile.st_size;
printf("The total is %d bytes so far.\n", total);
}
}
printf("The total is %d bytes.\n", total);
closedir(dr);
return total;
}

int main(int argc, char *argv[]) {
if (argc < 2) {
char cwd[1] = ".";
du_function(cwd);
} else
du_function(argv[1]);
return 0;
}

我在这里束手无策并尝试了各种解决方案,但出于某种原因 S_ISDIR 必须将某些东西识别为不是目录(或者从我那里接收到错误的输入,更有可能。)

最佳答案

char cwd[1] = "."; 对于 string 来说太小了。 空字符没有空间。

使用[] 并让编译器确定字符串 所需的大小。

char cwd[] = ".";

stat() 调用基于本地名称而不是完整路径。

#if 0
stat(de->d_name, &sfile);
#else
char buf[500];
snprintf(buf, sizeof buf, "%s/%s", direc, de->d_name);
stat(buf, &sfile);
#endif

(已删除)@PSkocik 中的类似发现


也许还存在其他问题。

关于c - 尝试打印目录和所有子目录中以字节为单位的总空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55093252/

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