ar out[500];
char *p;
if (lstat(argv[1],&buf)==-1)
{
// printf("No such file\n");
return -1;
}
}
这个时候我们已经得到了buf这个结构体,从这个结构体中很容易就能写出以下信息,实现起来比较容易:
//连接数
printf(" %d",buf.st_nlink);
// 用户id
struct passwd *user;
user=getpwuid(buf.st_uid);
printf(" %s",user->pw_name);
//组id
struct group *group;
group=getgrgid(buf.st_gid);
printf(" %s",group->gr_name);
//大小
printf(" %d ",buf.st_size);
//时间
struct tm *t;
t=localtime(&buf.st_ctime);
printf(" %d-%d-%d %d:%d",t->tm_year 1900,
t->tm_mon 1,
t->tm_mday,
t->tm_hour,
t->tm_sec);
printf(" %s",argv[1]);
到目前为止,还剩下文件类型,以及对于用户,组,其他用户的读写权限没有解析出来,其实我们所需要的信息已经包含在buf的st_mode中,只要对这个返回的st_mode进行解析就可以得到我们所需要的信息.
先来看看文件的类型,如何对文件类型来判断呢?可以使用掩码来解码得到文件的类型.在<sys/stat.h>中有以下定义:
#define S_IFMT 0170000
#define S_IFREG 0100000
#define S_IFDIR 0040000
#define S_IFBLK 0060000
....
我们如何要判断文件类型是否是普通文件,可以写如下代码:
if( (info.st_mode & 0170000) == 0100000)
printf("this is a regular file");
当然我们也可采取<sys/stat.h>中定义的宏来实现
#define S_ISFIFO(m) ((m) &(0170000) == (0010000))
#define S_ISREG(m) ( (m) & (0170000) == 0100000))
....
我们也可以写如下代码:
if( S_ISDIR(info.st_mode) )
printf("this is a regular file");
现在继续补充刚刚没有写完的程序:
if (S_ISREG(buf.st_mode)) p="-";
else if (S_ISDIR(buf.st_mode)) p="r";
else if (S_ISCHR(buf.st_mode)) p="c";
else if (S_ISBLK(buf.st_mode)) p="b";
else if (S_ISFIFO(buf.st_mode)) p="f";
else if (S_ISLNK(buf.st_mode)) p="l";
else if (S_ISSOCK(buf.st_mode)) p="s";
还剩下文件对不同用户的权限的描述怎么实现,同理用以上的方式来实现.
int n;
for(n=8;n>=0;n--)
{
if(buf.st_mode&(1<<n))
switch (n%3)
{
case 2: printf("r"); break;
case 1: printf("w"); break;
case 0: printf("x"); break;
}
else
printf("-");
}
这样将这四段写在一起,就完成了实现ls –l 特定的文件的功能.
|