这个博客很久没有管过了,今天学了一点unix环境编程,模拟了一个简单的ls -l 命令,从两点多一直写到现在,各种翻书,各种百度,总算是基本上完成了这一伟大的ls命令的阉割版,别的不多说了,脑袋都晕了,直接上代码(虽然代码写的很烂,大牛勿喷),不过注释什么的我觉得应该写的够详细了吧,希望大家能指出各种毛病,大牛能给出些建议
#include<stdio.h>
#include<sys/stat.h>//lstat
#include<time.h>//gmtime
#include<unistd.h>
#include<string.h>//strcmp
#include<error.h> //errno
#include<pwd.h>//getpwuid
#include<grp.h>//getgrgid
#include <dirent.h>//opendir/readdir/closedir
#include <sys/types.h>
void file_type(const struct stat *s)//显示文件类型
{
if(S_ISDIR(s->st_mode))//判断是否为文件夹
{
printf("d");
}
else if(S_ISREG(s->st_mode))//判断是否为普通文件
{
printf("-");
}
else
{
printf("其他");
}
}
void file_mode(const struct stat *s)//显示文件权限
{
unsigned short int a=0x0100;
int i=0;
for(i=0;i<9;i++)
{
if(i%3==0)
{
if(s->st_mode & a)//判断是否可读
{
printf("r");
}
else
{
printf("-");
}
a>>=1;
}
else if(i%3==1)//判断是否可写
{
if(s->st_mode & a)
{
printf("w");
}
else
{
printf("-");
}
a>>=1;
}
else//判断是否可执行
{
if(s->st_mode & a)
{
printf("x");
}
else
{
printf("-");
}
a>>=1;
}
}
}
void file_show(const struct stat *s,const char *file_name)//显示文件/文件夹信息操作
{
file_type(s);//显示文件类型
file_mode(s);//显示文件权限
printf("\t");
printf("%d",s->st_nlink);//显示文件硬链接/目录子目录数
printf("\t");
printf("%s",getpwuid(s->st_uid)->pw_name);//显示文件拥有者
printf("\t");
printf("%s",getgrgid(s->st_gid)->gr_name);//文件拥有者所在组
printf("\t");
printf("%ld",s->st_size);//显示文件大小
printf("\t");
struct tm *t = localtime(&s->st_mtime);//获取最后修改时间
printf("%d月 %d %02d:%02d",t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min);//显示最后修改时间
printf(" ");
printf("%s",file_name);
//printf("%o",s->st_mode);
printf("\n");
}
void dir_file(const struct stat *s,const char *file_name)//目录文件操作
{
DIR *d;
unsigned long int size= 0;
d = opendir(file_name);//打开目录
if(d)
{
struct dirent* p;
while(p=readdir(d))//读取目录中的文件和目录
{
if(p->d_name[0]=='.') {
continue;//跳过隐藏文件
}
char path[300] = "";
sprintf(path,"%s/%s",file_name,p->d_name);//获得相对路径
struct stat w;
lstat(path,&w);//获得文件信息
file_show(&w,p->d_name);
size+=w.st_size;
}
closedir(d);//关闭目录
printf("总用量 %ld\n",size);//文件夹用量
}
else
{
printf("%m");//打印错误信息
}
}
int main(int argc,char* argv[])
{
if(argc<3)//判断参数数量是否正确
{
puts("您的输入参数过少\n");
return -1;
}
if(strcmp(argv[1],"-l"))//判断参数是否正确
{
puts("您输入的参数有误");
return -2;
}
struct stat s;//定义一个接收文件信息的结构体
if(!lstat(argv[2],&s))//读取文件信息,判断是否读取成功
{
//printf("%s\n",s.st_mode);
if(S_ISDIR(s.st_mode))//判断是否为文件夹
{
printf("%s 是目录\n",argv[2]);
dir_file(&s,argv[2]);
}
else if(S_ISREG(s.st_mode))//判断是否为文件
{
printf("%s 是一般文件\n",argv[2]);
file_show(&s,argv[2]);//显示文件信息
}
else
{
puts("其他文件");
}
}
else
{
printf("%m");//打印错误信息
}
return 0;
}