В настоящее время я пытаюсь создать программу переменного тока, которая подсчитывает общий размер файла в байтах данного каталога, включая сам каталог, все файлы в нем и все файлы и каталоги во всех подкаталогах.По сути, меня просят запрограммировать замену 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
должен идентифицировать вещи как каталоги, которые не являются (или, скорее всего, получают неправильные данные от меня).