如何从C中的目录中获取所有文件的总字节数

时间:2017-05-08 17:34:22

标签: c linux file directory

我有一个目录的名称,然后我使用chdir()来更改目录。 现在,我如何获得总字节数?

由于

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<wait.h>
#include<sys/wait.h>
#include<sys/types.h>

void print_cwd(){
    char cwd[100];
    memset(cwd,0,sizeof(cwd));
    printf("current directory: %s \n",getcwd(cwd,sizeof(cwd)));
}

int main(){

int fd[2],nbytes;
pid_t childpid;
char string[]="hello world!\n";
char sir[80];
char readbuffer[80];
pipe(fd);

if ((childpid=fork())<0){
    printf("error");
    exit(1);
}
if (childpid==0){
    close(fd[0]);
    scanf("%s",sir);
    write(fd[1],sir,(strlen(sir)+1));
    exit(0);
}
else{
    close(fd[1]);
    nbytes=read(fd[0],readbuffer,sizeof(readbuffer));
    chdir(readbuffer);
    print_cwd();
}

return(0);

}

2 个答案:

答案 0 :(得分:1)

使用opendir(3)+ readdir(3)+ closedir(3)获取目录的内容。

使用stat(2)获取文件类型和每个目录条目的大小。

提示:不要忘记readdir只返回文件名,而不是文件的路径。您需要将传递给opendir的路径添加到从readdir收到的文件名,以获取您可以提供给stat的路径。

另外,dup2(2)使fd 1(stdout)成为管道编写者端的副本,然后使用execlp(3)执行du参数{ {1}}和路径。这将向父母发送类似以下内容:

-bs

答案 1 :(得分:0)

实际上,在递归函数中结合opendir()readdir()lstat(),我们有以下代码:

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


long long dirsize( const char * dir )
{
    DIR * dp = NULL;
    struct dirent * entry = NULL;
    struct stat statbuf;
    long long size = 0L;

    dp = opendir(dir);

    /* Cannot open directory: Ignoring... */
    if(!dp)
        return 0L;

    while( (entry = readdir(dp)) != NULL )
    {
        /* Get file status... */
        lstat( entry->d_name, &statbuf );

        /* Regular file found... */
        if( S_ISREG( statbuf.st_mode ) )
        {
            size += statbuf.st_size;
        }
        /* Directory found... */
        else if( S_ISDIR( statbuf.st_mode ) )
        {
            /* Ignore "." and ".." directories */
            if( !strcmp( ".", entry->d_name ) || !strcmp( "..", entry->d_name ) )
                continue;

            /* Recurse at a new directory */
            size += dirsize( entry->d_name );
        }
    }

    closedir(dp);

    return size;
}


int main( int argc, char * argv[] )
{
    if( argc < 1 )
        return 1;

    fprintf( stdout, "%lld Bytes\n", dirsize( argv[1] ) );

    return 0;
}

/* eof */

编译:

$ gcc -Wall dirsize.c -o dirsize

测试:

$ ./dirsize /tmp
120743918 Bytes