myls相关函数

来源:互联网 发布:网络五大鬼畜歌曲 编辑:程序博客网 时间:2024/06/09 18:49

//根据用户id获取用户名

getpwuid()

#include <pwd.h>

struct passwd *getpwuid(uid_t uid);

//根据组id获取组名

getgrgid()

#include <grp.h>

struct group *getgrgid(gid_t gid);

//转化时间格式

localtime()

#include <time.h>

struct tm *localtime(const time_t *timep);

//读取软链接的名字

readlink()

ssize_t  readlink(const  char *path, char *buf, size_t bufsiz);


举例子:

void fun(const char *path,const char *filename);

 

int main(int argc, char *argv[])

{

char w[128]={0};

 

//判断命令行参数

if(argc<2)

{

//当前目录

strcpy(w,"./");

}

else

{

//通过参数传入的指定目录

strcpy(w,argv[1]);

}

printf("%s\n",argv[1]);

printf("%s\n",w);

 

struct stat buf;

int ret=0;

//判断w数组中目录的属性

ret=lstat(w,&buf);

if(ret<0)

{

perror("lstat");

exit(0);

}

 

if(S_ISDIR(buf.st_mode))//目录

{

DIR *dirp=NULL;

dirp=opendir(w);

struct dirent *dsp;

char path[128]={0};

while((dsp=readdir(dirp))!=NULL)

{

//.说明是隐藏文件

if(dsp->d_name[0]=='.')

{

continue;

}

else

{

memset(path,0,sizeof(path));

strcpy(path,w);

strcat(path,dsp->d_name);

//文件路径和文件名

fun(path,dsp->d_name);

}

}

}

else//不是目录,是普通文件

{

//此时w中保存的是文件名

fun(w,w);

}

 

return 0;

}

 

void fun(const char *path,const char *filename)

{

struct stat buf;

int ret=0;

ret=lstat(path,&buf);

if(ret<0)

{

perror("lstat");

exit(0);

}

 

//打印文件的类别

switch(buf.st_mode & S_IFMT)

{

case S_IFREG:

printf("-");

break;

case S_IFDIR:

printf("d");

break;

case S_IFCHR:

printf("c");

break;

case S_IFBLK:

printf("b");

break;

case S_IFIFO:

printf("p");

break;

case S_IFSOCK:

printf("s");

break;

case S_IFLNK:

printf("l");

break;

}

 

 

//打印文件的权限

int n=0;

for(n=8;n>=0;n--)

{

if(buf.st_mode & (1<<n))

{

switch(n%3)

{

case 0:

printf("x");

break;

case 1:

printf("w");

break;

case 2:

printf("r");

break;

}

}

else

{

printf("-");

}

}

 

//打印硬链接数

printf(" %d",buf.st_nlink);

 

//打印用户名

struct passwd *pw;

pw=getpwuid(buf.st_uid);

printf(" %s",pw->pw_name);

//打印用户组名字

struct group *gr;

gr=getgrgid(buf.st_gid);

printf(" %s",gr->gr_name);

 

//打印文件的大小

printf(" %ld",buf.st_size);

 

//打印文件最后访问的时间

struct tm *tm;

tm=localtime(&buf.st_atime);

printf(" %d-%d-%d %d:%d",tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min);

 

//打印文件名

char out[128]={0};

if(S_ISLNK(buf.st_mode))

{

printf(" %s",filename);

printf("->");

readlink(filename,out,sizeof(out));

printf("%s\n",out);

}

else

{

printf(" %s\n",filename);

}

}

0 0
原创粉丝点击