当前位置: 技术问答>linux和unix
linux查看下级目录的时候可以,但是查看上级目录文件属性的时候出现了错误,求高手指点
来源: 互联网 发布时间:2017-01-16
本文导语: /*这个程序有一个参数.如果这个参数是一个文件名,输出这个文件的大小和最后修改的时间, 如果是一个目录输出这个目录下所有文件的大小和修改时间. 查看下级目录的时候可以, 但是在查看上级目录属性的时...
/*这个程序有一个参数.如果这个参数是一个文件名,输出这个文件的大小和最后修改的时间,
如果是一个目录输出这个目录下所有文件的大小和修改时间. 查看下级目录的时候可以,
但是在查看上级目录属性的时候出现了错误*/
#include
#include
#include
#include
#include
#include
#include
static int get_file_size_time(const char *filename)
{
struct stat statbuf;
printf("file name:%sn", filename);
if(stat(filename,&statbuf)==-1)
{
printf("Get stat on %s Error:%sn", filename,strerror(errno));
return(-1);
}
if(S_ISDIR(statbuf.st_mode))
return(1);
if(S_ISREG(statbuf.st_mode))
printf("%s size:%ld bytestmodified at %s", filename,statbuf.st_size,ctime(&statbuf.st_mtime));
return(0);
}
int main(int argc,char **argv)
{
DIR *dirp;
struct dirent *direntp;
int stats;
if(argc!=2)
{
printf("Usage:%s filenamena",argv[0]);
exit(1);
}
if(((stats=get_file_size_time(argv[1]))==0)||(stats==-1))
exit(1);
if((dirp=opendir(argv[1]))==NULL)
{
printf("Open Directory %s Error:%sn", argv[1],strerror(errno));
exit(1);
}
while((direntp=readdir(dirp))!=NULL)
{
if(get_file_size_time(direntp->d_name) == -1) //if(get_file_size_time(direntp->d_name) == -1)
break;
}
return 0;
}
如果是一个目录输出这个目录下所有文件的大小和修改时间. 查看下级目录的时候可以,
但是在查看上级目录属性的时候出现了错误*/
#include
#include
#include
#include
#include
#include
#include
static int get_file_size_time(const char *filename)
{
struct stat statbuf;
printf("file name:%sn", filename);
if(stat(filename,&statbuf)==-1)
{
printf("Get stat on %s Error:%sn", filename,strerror(errno));
return(-1);
}
if(S_ISDIR(statbuf.st_mode))
return(1);
if(S_ISREG(statbuf.st_mode))
printf("%s size:%ld bytestmodified at %s", filename,statbuf.st_size,ctime(&statbuf.st_mtime));
return(0);
}
int main(int argc,char **argv)
{
DIR *dirp;
struct dirent *direntp;
int stats;
if(argc!=2)
{
printf("Usage:%s filenamena",argv[0]);
exit(1);
}
if(((stats=get_file_size_time(argv[1]))==0)||(stats==-1))
exit(1);
if((dirp=opendir(argv[1]))==NULL)
{
printf("Open Directory %s Error:%sn", argv[1],strerror(errno));
exit(1);
}
while((direntp=readdir(dirp))!=NULL)
{
if(get_file_size_time(direntp->d_name) == -1) //if(get_file_size_time(direntp->d_name) == -1)
break;
}
return 0;
}
|
正解噢!
略改了下,看看!
#include
#include
#include
#include
#include
#include
#include
static int get_file_size_time(const char *filename)
{
struct stat statbuf;
//printf("file name:%sn", filename);
if(stat(filename,&statbuf)==-1)
{
printf("Get stat on %s Error:%sn", filename,strerror(errno));
return(-1);
}
if(S_ISDIR(statbuf.st_mode)) // 是目录
{
printf("Dir: [%s]n", filename);
return(1);
}
if(S_ISREG(statbuf.st_mode))
printf("File: [%s] Size:%ld bytestModified at %sn", filename,statbuf.st_size,ctime(&statbuf.st_mtime));
return(0);
}
int main(int argc,char **argv)
{
DIR *dirp;
struct dirent *direntp;
int stats;
if(argc!=2)
{
printf("Usage:%s n",argv[0]);
exit(1);
}
if(((stats=get_file_size_time(argv[1]))==0)||(stats==-1))
exit(1);
if((dirp=opendir(argv[1]))==NULL)
{
printf("Open Directory %s Error:%sn", argv[1],strerror(errno));
exit(1);
}
chdir(argv[1]); // 更改当前工作目录
while((direntp=readdir(dirp))!=NULL)
{
if(get_file_size_time(direntp->d_name) == -1) // 因为direntp->d_name不包含路径,所以在while之前要调用chdir()
break;
}
return 0;
}
运行结果:
[zcm@t #28]$./a ~/bin
Dir: [/home/zcm/bin]
File: [checkbill_proc.list] Size:105 bytes Modified at Sun Oct 30 21:54:34 2011
Dir: [.]
File: [checkbill_proc.sh] Size:559 bytes Modified at Sun Oct 30 21:54:55 2011
File: [LoadMain] Size:733134 bytes Modified at Tue Nov 1 05:19:58 2011
File: [a.sh] Size:701 bytes Modified at Sun Nov 6 20:36:53 2011
Dir: [..]
File: [CollectMain] Size:906826 bytes Modified at Tue Nov 1 05:19:58 2011
File: [CheckMain] Size:760355 bytes Modified at Tue Nov 1 05:19:58 2011
Dir: [log]
File: [nohup.out] Size:7637 bytes Modified at Tue Nov 1 02:18:59 2011
|
就你这么两行代码我能看不仔细么,不就是stat判断是否目录,opendir+readdir遍历当前目录下的文件么。
哪里体现出向上路径查看?
|
direntp->d_name不包括路径信息,stat(file)而这个file不在当前工作目录下当然出现错误,至于你说的向下路径查看可以我想多半是碰巧file也存在于当前工作目录吧,你先调用chdir()就可以了