1.从终端获取一个文件名。
2.若该文件是目录文件,则将该文件下的所有文件的属性显示到终端,类似ls -l该文件夹
3.若该文件不是目录文件,则显示
#include <head.h>
//看文件类别
char getflietype(mode_t m);
//看权限"rwx"
void getfilepermission(mode_t m);
//ino_t 号
int getfileinot(ino_t ino);
//硬链接数
void getfilenlinkt(nlink_t n);
//用户的uid
char *getusrname(uid_t uid);
//文件大小off_t
int getofft(off_t size);
//时间
void gettime(time_t t);
//组用户的gid
char *getgrpname(gid_t gid);
//读取文件名
char *getfilename(char *name);
void getname(char *s1);
--------------------------------------
#include "heead.h"
//看文件类别
char getflietype(mode_t m)
{
char mode;
switch(m & S_IFMT)
{
case S_IFBLK: mode = 'b'; break;
case S_IFCHR: mode = 'c'; break;
case S_IFDIR: mode = 'd'; break;
case S_IFIFO: mode = 'p'; break;
case S_IFLNK: mode = 'i'; break;
case S_IFREG: mode = '-'; break;
case S_IFSOCK: mode = 's'; break;
default: printf("unknown\n"); break;
}
return mode;
}
//看权限"rwx"
void getfilepermission(mode_t m)
{
char buf[] = "rwx";
int i;
for(i=0;i<9;i++)
{
if ((m & (0400)>>i) == 0)
{
putchar('-');
continue;
}
printf("%c",buf[i%3]);
}
printf(" ");
}
//ino_t 号
int getfileinot(ino_t ino)
{
int n1;
n1 = ino;
return n1;
}
//硬链接数
void getfilenlinkt(nlink_t n)
{
printf("%ld ",n);
}
//用户的uid
char *getusrname(uid_t uid)
{
char s1[20];
char *p = s1;
struct passwd* usr = getpwuid(uid);
if(NULL == usr)
{
perror("getpwuid");
return NULL;
}
strcpy(p,usr->pw_name);
return p;
}
//组用户的gid
char *getgrpname(gid_t gid)
{
char s2[20];
char *p = s2;
struct group* gr = getgrgid(gid);
if(NULL == gr)
{
perror("getgrpname");
return NULL;
}
strcpy(p,gr->gr_name);
return p;
}
//文件大小off_t
int getofft(off_t size)
{
int k1 = size;
return k1;
}
//时间
void gettime(time_t t)
{
time(&t);
struct tm* info = NULL;
info = localtime(&t);
printf("%4d-%02d-%02d %02d:%02d:%02d\r",\
info->tm_year+1900,info->tm_mon+1,info->tm_mday,\
info->tm_hour,info->tm_min,info->tm_sec);
fflush(stdout);
sleep(1);
printf("\n");
}
char *getfilename(char *name)
{
char s[20];
char *p = s;
strcpy(p,name);
printf("%s ",p);
return p;
}
void getname(char *s1)
{
int b = strlen(s1);
printf("b= %d\n",b);
int k=0;
char s2[20];
char *p = s2;
int j,r;
for(j=b;j <= b;j--)
{
if(*(s1+j) == '/')
{
break;
}
//printf("%c ",*(s1+j));
}
for(r=j+1,k=0;r<=b;r++,k++)
{
printf("%c ",*(s1+r));
*(p+k) = *(s1+r);
}
printf(" ");
// *(p+k+1) = '\0';
}
---------------------------------------
#include "heead.h"
int main()
{
//获取文件属性
char s1[40] = "";;
printf("输入文件路径名:");
scanf("%s",s1);
struct stat buf;
int k = stat(s1,&buf);
if(k < 0)
{
perror("error\n");
return 0;
}
printf("Mode = %o\n",buf.st_mode);
//对比权限类别d为目录文件
char mode;
char *uidname = NULL;
char *gidname = NULL;
char *filename = NULL;
char rwx[10] = "";
int k1=0;
int n1=0;
time_t t1;
mode = getflietype(buf.st_mode);
if(mode != 'd')//目录文件
{
printf("该文件为非目录文件\n");
getname(s1);//文件名
getfilepermission(buf.st_mode);//权限rwx
n1 = getfileinot(buf.st_ino);//ino_t号
mode = getflietype(buf.st_mode);//文件类别
uidname = getusrname(buf.st_uid);//用户uid
gidname = getgrpname(buf.st_gid);//组用户gid
k1 = getofft(buf.st_size);//文件大小size*/
printf("%s %d %c %s %s %d ",filename,n1,mode,uidname,gidname,k1);
gettime(t1);
}
else//非目录文件
{
printf("该文件为目录文件\n");
//stat(s1,&buf);
DIR* dp = opendir(s1);
if(NULL == dp)
{
perror("error\n");
return -1;
}
struct dirent* rp = NULL;
while(1)
{
rp = readdir(dp);
if(NULL == rp)
{
printf("目录读取完毕\n");
break;
}
if(*(rp->d_name) != '.')
{
filename = getfilename(rp->d_name);//文件名
getfilepermission(buf.st_mode);//权限rwx
n1 = getfileinot(buf.st_ino);//ino_t号
mode = getflietype(buf.st_mode);//文件类别
uidname = getusrname(buf.st_uid);//用户uid
gidname = getgrpname(buf.st_gid);//组用户gid
k1 = getofft(buf.st_size);//文件大小size*/
printf("%s %d %c %s %s %d ",filename,n1,mode,uidname,gidname,k1);
gettime(t1);
rp = rp->d_name;
}
}
}
return 0;
}
-----------------------------------------------
输入文件路径名:/home/ubuntu/hqyj/HQYJ/IO/D4/z1/k1.c
Mode = 100664
该文件为非目录文件
k 1 . c rw-rw-r-- (null) 528922 - ubuntu ubuntu 1765 2023-08-01 23:19:57
ubuntu@ubuntu:z1$ ./a.out
输入文件路径名:/home/ubuntu/hqyj/HQYJ/IO/D4/z1
Mode = 40775
该文件为目录文件
a.out rwxrwxr-x ubuntu 528878 d ubuntu ubuntu 4096 2023-08-01 23:20:16
test1.c rwxrwxr-x ubuntu 528878 d ubuntu ubuntu 4096 2023-08-01 23:20:17
k1.c rwxrwxr-x ubuntu 528878 d ubuntu ubuntu 4096 2023-08-01 23:20:18
heead.h rwxrwxr-x ubuntu 528878 d ubuntu ubuntu 4096 2023-08-01 23:20:19
core rwxrwxr-x ubuntu 528878 d ubuntu ubuntu 4096 2023-08-01 23:20:20
heead.h.gch rwxrwxr-x ubuntu 528878 d ubuntu ubuntu 4096 2023-08-01 23:20:21
目录读取完毕
该文件的属性到终端上,类似ls-这单个文件