Linux目录大小问题与C

Linux目录大小问题与C,c,linux,C,Linux,以下是我需要做的: 编写一个C程序来计算文件的总大小 目录和目录的子目录 总大小应包括子目录(目录)的大小 也是文件)和顶级目录的大小。如果文件是 符号链接,不应取消对符号链接的引用。所以 符号链接的大小将添加到总大小,而不是 链接指向的文件。为了便于测试,您的程序 应仅打印以字节为单位的总大小,即一个数字, 没有别的了 以下是我所拥有的: #include <sys/stat.h> #include <sys/types.h> #include <dirent.h

以下是我需要做的:

编写一个C程序来计算文件的总大小 目录和目录的子目录 总大小应包括子目录(目录)的大小 也是文件)和顶级目录的大小。如果文件是 符号链接,不应取消对符号链接的引用。所以 符号链接的大小将添加到总大小,而不是 链接指向的文件。为了便于测试,您的程序 应仅打印以字节为单位的总大小,即一个数字, 没有别的了

以下是我所拥有的:

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

int main(int argc, char *argv[]){
    char* folder =  argv[1]; 
    long length;
    DIR* dir_p;
    struct dirent* dir_element;
    struct stat file_info;

    dir_p = opendir(folder);

    while(dir_element = readdir(dir_p)){

        lstat(dir_element->d_name, &file_info);
        length+=file_info.st_size;
        printf("%s\n" , dir_element->d_name);
    }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[]){
char*folder=argv[1];
长度长;
DIR*diru\p;
结构方向*方向元素;
结构统计文件信息;
dir\u p=opendir(文件夹);
while(dir_元素=readdir(dir_p)){
lstat(目录元素->文件名和文件信息);
长度+=文件大小;
printf(“%s\n”,dir\u元素->d\u名称);
}
返回0;
}

这里的问题是,由于某种原因,我没有得到正确的号码。我在Ubuntu(Linux)中使用du-abc“directory\u pathname”调用检查程序的输出

您从不初始化
长度
。此外,您还需要实际递归到目录中。将
while
放入一个函数中,然后为您找到的每个目录调用该函数(检查
man stat
以了解如何判断文件是否为目录;我忘记了从头开始的确切测试,但它是
struct stat
的一个成员)。

您从未初始化
length
。此外,您还需要实际递归到目录中。将
while
放入一个函数中,然后为您找到的每个目录调用该函数(检查
man stat
以了解如何判断文件是否为目录;我忘记了头顶上的确切测试,但它是
struct stat
的成员).

你能给我看一个与这个问题相关的递归函数的例子吗?@NeilShah-从个人经验来看,你会学到更多。如果你不明白,用新代码和更新的症状更新你的问题。你能给我看一个与这个问题相关的递归函数示例吗?@NeilShah-从个人经验来看,你会学到更多。如果您无法理解,请使用新代码和更新的症状更新您的问题。虽然您可以使用
opendir
递归执行此操作,但不要忘记检查手册页中的
ftw
nftw
(同一页)。遍历整个目录树基本上就是他们所做的。(尽管回调函数的使用可能有点像一条学习曲线)(它只是一个函数指针,可以按您需要的方式传递以处理每个文件或目录)我试着按照您所说的做,但现在我遇到了SegeStation错误,我无法发布一个新问题我应该做什么。请看一看包含在中的示例。我是否需要定义X_OPEN_SOURCE如果您使用的是
nftw
(是),手册页上说
nftw():\u XOPEN\u SOURCE>=500
,如果您只是使用
ftw
,那么(否)。手册页,虽然一开始是公认的晦涩难懂的,但对c库中的每个函数都是非常简洁的引用。(也用于程序集调用约定)。很值得和他们交朋友。如果您有更多问题,请告诉我。虽然您可以使用
opendir
递归执行此操作,但不要忘记检查手册页中的
ftw
nftw
(同一页)。遍历整个目录树基本上就是他们所做的。(尽管回调函数的使用可能有点像一条学习曲线)(它只是一个函数指针,可以按您需要的方式传递以处理每个文件或目录)我试着按照您所说的做,但现在我遇到了SegeStation错误,我无法发布一个新问题我应该做什么。请看一看包含在中的示例。我是否需要定义X_OPEN_SOURCE如果您使用的是
nftw
(是),手册页上说
nftw():\u XOPEN\u SOURCE>=500
,如果您只是使用
ftw
,那么(否)。手册页,虽然一开始是公认的晦涩难懂的,但对c库中的每个函数都是非常简洁的引用。(也用于程序集调用约定)。很值得和他们交朋友。如果您有更多问题,请告诉我。