#include <stdio.h>
#include <sys/types.h>//stst函数的头文件
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>//exit函数的头文件
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <dirent.h>
#include <string.h>
void File_Type(char argv[]);
int main(int argc,char **argv)
{
struct stat st;//文件属性对应的结构体
DIR *dp;
struct dirent *dep;
char path_name[100];
if(argc != 2){
fprintf(stderr,"请输入正确的参数\n");
exit(1);
}
stat(argv[1],&st);
//输出文件类型
if(S_ISREG(st.st_mode)){
//fprintf(stdout,"-");//普通文件
File_Type(argv[1]);//如果是普通文件就直接显示文件属性
}
else if(S_ISDIR(st.st_mode)){
//fprintf(stdout,"d");//目录
dp = opendir(argv[1]);
if(dp == NULL){
fprintf(stderr,"读取目录失败\n");
exit(1);
}
while((dep=readdir(dp)) != NULL){
if(dep->d_name[0]=='.'){//遇到隐藏文件就跳过
continue;
}
//这里一定要取出来路径,不然使用readdir函数仅仅是读取名字而已
if(argv[1][strlen(argv[1])-1] == '/'){//如果传进来的目录后面有/
sprintf(path_name,"%s%s",argv[1],dep->d_name);
//printf("%s\n",path_name);//打印出所有的目录文件
}else{//如果传进来的目录后面没有/
sprintf(path_name,"%s/%s",argv[1],dep->d_name);
}
//printf("%s\n",path_name);//打印出所有的目录文件
File_Type(path_name);
}
}
return 0;
}
void File_Type(char argv[])
{
struct stat st;//文件属性对应的结构体
struct tm *Tm;//时间对应的结构体
char Mode[4]="xwr-";
char i;
stat(argv,&st);
//输出文件类型
if(S_ISREG(st.st_mode))
fprintf(stdout,"-");//普通文件
else if(S_ISDIR(st.st_mode))
fprintf(stdout,"d");//目录
else if(S_ISCHR(st.st_mode))
fprintf(stdout,"c");//字符文件
else if(S_ISBLK(st.st_mode))
fprintf(stdout,"b");//块
else if(S_ISFIFO(st.st_mode))
fprintf(stdout,"p");//管道文件
else if(S_ISLNK(st.st_mode))
fprintf(stdout,"l");//链接文件
else if(S_ISSOCK(st.st_mode))
fprintf(stdout,"s");//套接字
//输出文件权限
for(i=8;i>=0;i--){
if(st.st_mode & (0x01<<i)){
printf("%c",Mode[i%3]);
}else{
printf("-");
}
}
//输出文件硬链接数
fprintf(stdout," %-4u",st.st_nlink);
//输出文件拥有者
fprintf(stdout,"%-10s",getpwuid(st.st_uid)->pw_name);
//输出文件所属组
fprintf(stdout,"%-10s",getgrgid(st.st_gid)->gr_name);
//输出文件大小
fprintf(stdout,"%-10ld ",st.st_size);
//输出文件最后修改时间
Tm = localtime(&st.st_mtime);
fprintf(stdout,"%-2d%-2d %02d:%02d",Tm->tm_mon+1,Tm->tm_mday,Tm->tm_hour,Tm->tm_min);
//输出文件名
//fprintf(stdout," %s\n",argv);
i=strlen(argv);//去除包含有/的路径,只罗列文件名
while(i--){
if(argv[i]=='/') break;
}
printf(" %s\n",&argv[i+1]);
}
linux完成与ls -l相同功能程序
最新推荐文章于 2024-07-16 12:57:18 发布