#include<iostream>
#include<cstring>
#include<sys/types.h>
#include<sys/stat.h>
#include<cstdlib>
#include<ctime>
#include<pwd.h>
#include<grp.h>
using namespace std;
int main(int argc, char * argv[])
{
if(argc < 2)
{
cout<<"./a.out filename\n";
exit(1);
}
struct stat st;
int ret = stat(argv[1], &st);
if( -1 == ret)
{
perror("stat");
exit(1);
}
//存储文件属性
char parm[11] = {0};
switch(st.st_mode & S_IFMT)
{
case S_IFLNK:
parm[0] = 'l';
break;
case S_IFDIR:
parm[0] = 'd';
break;
case S_IFREG:
parm[0] = '-';
break;
case S_IFBLK:
parm[0] = 'b';
break;
case S_IFCHR:
parm[0] = 'c';
break;
case S_IFSOCK:
parm[0] = 's';
break;
case S_IFIFO:
parm[0] = 'P';
break;
default:
parm[0] = '?';
}
//判断文件访问权限
//文件所有者
parm[1] = (st.st_mode & S_IRUSR)?'r':'-';
parm[2] = (st.st_mode & S_IWUSR)?'w':'-';
parm[3] = (st.st_mode & S_IXUSR)?'x':'-';
//文件所属组
parm[4] = (st.st_mode & S_IRGRP)?'r':'-';
parm[5] = (st.st_mode & S_IWGRP)?'w':'-';
parm[6] = (st.st_mode & S_IXGRP)?'x':'-';
//其他用户
parm[7] = (st.st_mode & S_IROTH)?'r':'-';
parm[8] = (st.st_mode & S_IWOTH)?'w':'-';
parm[9] = (st.st_mode & S_IXOTH)?'x':'-';
//硬链接数
int linkNum = st.st_nlink;
//文件拥有者
char * own = getpwuid(st.st_uid)->pw_name;
//所属组
char * grp = getgrgid(st.st_uid)->gr_name;
int size = int(st.st_size);
//修改时间
char * time = ctime(&st.st_mtime);
cout<<parm<<" "<<linkNum<<" "<<own<<" "<<grp<<" "<<size<<" "<<time<<" "<<argv[1]<<endl;
return 0;
}
这里的stat函数是一个穿透函数,就是说如果你用./a.out 软连接,得到的是被链接文件的信息,如果使用lstat则那么他得出的信息就是这个软连接文件的信息
创建软连接的命令是 ln -s 被连接文件的名字 链接的名字