目录操作和文件属性
// opendir
if((dir_ptr=opendir(dirname))==NULL)
{
printf("ls :cannot open %s\n",dirname);
}
// readdir
while ((direntp=readdir(dir_ptr))!=NULL)
{
dostat(direntp->d_name);
}
// closedir
closedir(dir_ptr);
// stat 得到file的属性
struct stat info;
if(stat(filename,&info)!=-1)
{
show_stat_info(filename,&info);
return ;
}
以ls命令为例
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<dirent.h>
#include<pwd.h>
#include<grp.h>
void show_stat_info(char* name,struct stat* info);
char* uid_to_name(uid_t uid);
char* gid_to_name(gid_t gid);
void do_ls(char[]);
void dostat(char* filename);
int main(int ac,char *av[])
{
if(ac==1)
{
do_ls(".");
}
else
{
while (--ac)
{
/* code */
printf("%s:\n",*++av);
do_ls(*av);
}
}
struct stat info;
if(ac>1)
{
if(stat(av[1],&info)!=-1)
{
show_stat_info(av[1],&info);
return 0;
}else{
perror(av[1]);
}
}
return -1;
}
void do_ls(char dirname[])
{
DIR* dir_ptr;
struct dirent* direntp;
if((dir_ptr=opendir(dirname))==NULL)
{
printf("ls :cannot open %s\n",dirname);
}else{
while ((direntp=readdir(dir_ptr))!=NULL)
{
dostat(direntp->d_name);
}
closedir(dir_ptr);
}
}
void dostat(char* filename)
{
struct stat info;
if(stat(filename,&info)!=-1)
{
show_stat_info(filename,&info);
return ;
}else{
perror(filename);
}
}
void show_stat_info(char* name,struct stat* info)
{
printf(" mode:%o ",info->st_mode);
printf(" links:%ld ",info->st_nlink);
printf(" user:%s ",uid_to_name(info->st_uid));
printf(" group:%s ",gid_to_name(info->st_gid));
printf(" size:%ld ",info->st_size);
printf(" modtime:%ld ",info->st_mtim.tv_sec);
printf(" name:%s\n",name);
}
char* uid_to_name(uid_t uid)
{
if(getpwuid(uid)==NULL)
{
return "UID";
}else
{
return getpwuid(uid)->pw_name;
}
}
char* gid_to_name(gid_t gid)
{
if(getgrgid(gid)==NULL)
{
return "UID";
}else
{
return getpwuid(gid)->pw_name;
}
}