我有一个目录的名称,然后我使用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);
}
答案 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