2017-05-08 25 views
-1

我有一個目錄的名稱,然後我使用chdir()來更改目錄。 現在,我怎樣才能獲得總字節數?如何獲取來自目錄中所有文件的字節總數C

由於

#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); 

} 
+1

你能提供你的問題的代碼示例嗎? – PrestonM

+0

使用'readdir'獲取文件列表,然後使用'stat'獲取文件的大小。 – ikegami

+0

我寫了。 @PrestonM – Scusf0

回答

1

使用opendir(3)+ readdir(3)+ closedir(3)以獲得目錄的內容。

使用stat(2)獲取文件的類型和每個目錄條目的大小。

提示:不要忘記,readdir只返回文件名,而不是文件的路徑。您將需要預先將傳遞至opendir的路徑預設爲從readdir收到的文件名,以獲取您可以提供給stat的路徑。


Alternativly,dup2(2),以使FD 1(標準輸出)管的作家末端的拷貝,然後使用execlp(3)以參數-bs和路徑執行du。這將發送類似下面父:

12345 /the/provided/path 
+0

如果我正在處理當前目錄,仍然需要使用opendir? – Scusf0

+0

是的。它創建'readdir'使用的句柄。 ///沒有理由調用'chdir'。 – ikegami

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 
+0

我不知道爲什麼,但它返回給我0字節.. – Scusf0

+0

@ Scusf0,發佈的程序無法打開目錄(當!!dp時)返回'0'。在這種情況下,'errno'將會設置一個你可以檢查的錯誤代碼(或者使用'perror'輸出)。 – ikegami

+0

@Lacobus在我的回答中做了我提醒過的錯誤。在將其用作路徑之前,他們忘記將文件名稱與目錄路徑加在一起。 – ikegami

相關問題