标签:reg def 网络 数组 硬连接 col lin 隐藏 tar
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<dirent.h> #include<errno.h> #include<unistd.h> #include<pwd.h> #include<grp.h> #include<time.h> #include<glob.h> #include<string.h> #define BUFSIZE 100 //判断是否是 . .. 文件 int dot_dir(const char *path) { char *p = NULL; p = strrchr(path,‘/‘); if(p != NULL) { if(!strcmp(p,"/.")||!strcmp(p,"/..")) return 1; } return 0; } int myblock(const char *path) { struct stat cur_stat; int sum = 0; glob_t globres; char buf[BUFSIZE] = {}; int i; if (lstat(path,&cur_stat) < 0)//判断lstat函数是否成功 { // perror("lstat()"); return -1; } if(!S_ISDIR(cur_stat.st_mode))//判断是不是目录文件,不是直接输出大小 { return cur_stat.st_blocks; } //如果是目录 sum += cur_stat.st_mode;//本身也会有大小 strcpy(buf,path); strcat(buf,"/*");//目录下的所有文件 glob(buf,0,NULL,&globres); //隐藏文件 memset(buf,‘\0‘,BUFSIZE); strcpy(buf,path); strcat(buf,"/.*"); glob(buf,GLOB_APPEND,NULL,&globres); for(i = 0;i < globres.gl_pathc;i++) { if(dot_dir((globres.gl_pathv)[i])) continue; sum += myblock((globres.gl_pathv)[i]); } return sum; } int mystat(const char *path) { struct stat m_stat;//定义stat类型的结构体 struct passwd *pwd = NULL;//定义拥有者 struct group *grp = NULL;//定义所属组 struct tm *tmp = NULL;//定义时间 char buf[BUFSIZE] = {};//定义存放时间字符串的数组 if(lstat(path,&m_stat)==-1) { //perror("stat()"); return 1; } //判断文件类型 switch(m_stat.st_mode & S_IFMT) { case S_IFREG: printf("-");//普通文件 break; case S_IFDIR: putchar(‘d‘);//目录文件 break; case S_IFSOCK: putchar(‘s‘);//网络套接字文件 break; case S_IFLNK: putchar(‘l‘);//链接文件 break; case S_IFBLK: putchar(‘b‘);//块设备文件 break; case S_IFCHR: putchar(‘c‘);//字符设备文件 break; case S_IFIFO: putchar(‘p‘);//管道文件 break; default: break; } //判断文件权限 if(m_stat.st_mode & S_IRUSR) putchar(‘r‘); else putchar(‘-‘); if(m_stat.st_mode & S_IWUSR) putchar(‘w‘); else putchar(‘-‘); if(m_stat.st_mode & S_IXUSR) putchar(‘x‘); else putchar(‘-‘); //显示硬连接数 printf(" %ld ",m_stat.st_nlink); //文件拥有者姓名 pwd = getpwuid(m_stat.st_uid); printf(" %s ",pwd->pw_name); //文件所属组姓名 grp = getgrgid(m_stat.st_gid); printf(" %s ",grp->gr_name); //总字节个数 printf("% ld ",m_stat.st_blocks); //获取文件的时间 tmp = localtime(&m_stat.st_mtim.tv_sec); if(tmp == NULL) return 1; strftime(buf,BUFSIZE,"%m月 %d %H:%M", tmp); printf("%s",buf); //输出文件名 printf(" %s",path); printf("\n"); } int mydir(const char *path) { DIR *dp = NULL; struct dirent *entry = NULL; struct stat m_stat; if (lstat(path,&m_stat) < 0)//判断lstat函数是否成功 { return 1; } if(!S_ISDIR(m_stat.st_mode))//判断所打开的文件是不是目录文件 { return 1; } dp = opendir(path); if(dp==NULL) { //perror("opendir()"); return 1; } while(1) { entry = readdir(dp); if(entry == NULL) { if(errno) { // perror("readdir()"); closedir(dp); return 1; } break; } printf("%s\n",entry->d_name); } closedir(dp); return 0; } int main(int argc,char *argv[]) { char *optstring = "-a:l:i:h:"; int c; int re; struct stat cur_stat; if(argc < 2) return 1; while(1) { c = getopt(argc,argv,optstring); if(c==-1) break; switch(c) { case ‘a‘:re= mydir(optarg);//打开所有文件 if(re == 1) { printf("error!\n"); } break; case ‘l‘:if(re == mystat(optarg))//打印文件详细信息 printf("error!\n"); break; case ‘i‘: stat(optarg,&cur_stat);//打印文件iNode号 printf("%ld\n",cur_stat.st_ino); break; case ‘h‘:re = myblock(optarg);//打印文件大小 if(re == -1) printf("error!\n"); else printf("%d k \n",re); break; case ‘?‘:printf("不认识此选项%s\n",argv[optind-1]); } } return 0; }
#include<sys/stat.h>
#include<dirent.h>
#include<errno.h>
#include<unistd.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
#include<glob.h>
#include<string.h>
#define BUFSIZE 100
//判断是否是 . .. 文件
int dot_dir(const char *path)
{
char *p = NULL;
p = strrchr(path,‘/‘);
if(p != NULL)
{
if(!strcmp(p,"/.")||!strcmp(p,"/.."))
return 1;
}
return 0;
}
int myblock(const char *path)
{
struct stat cur_stat;
int sum = 0;
glob_t globres;
char buf[BUFSIZE] = {};
int i;
if (lstat(path,&cur_stat) < 0)//判断lstat函数是否成功
{
// perror("lstat()");
return -1;
}
if(!S_ISDIR(cur_stat.st_mode))//判断是不是目录文件,不是直接输出大小
{
return cur_stat.st_blocks;
}
//如果是目录
sum += cur_stat.st_mode;//本身也会有大小
strcpy(buf,path);
strcat(buf,"/*");//目录下的所有文件
glob(buf,0,NULL,&globres);
//隐藏文件
memset(buf,‘\0‘,BUFSIZE);
strcpy(buf,path);
strcat(buf,"/.*");
glob(buf,GLOB_APPEND,NULL,&globres);
for(i = 0;i < globres.gl_pathc;i++)
{
if(dot_dir((globres.gl_pathv)[i]))
continue;
sum += myblock((globres.gl_pathv)[i]);
}
return sum;
}
int mystat(const char *path)
{
struct stat m_stat;//定义stat类型的结构体
struct passwd *pwd = NULL;//定义拥有者
struct group *grp = NULL;//定义所属组
struct tm *tmp = NULL;//定义时间
char buf[BUFSIZE] = {};//定义存放时间字符串的数组
if(lstat(path,&m_stat)==-1)
{
//perror("stat()");
return 1;
}
//判断文件类型
switch(m_stat.st_mode & S_IFMT)
{
case S_IFREG:
printf("-");//普通文件
break;
case S_IFDIR:
putchar(‘d‘);//目录文件
break;
case S_IFSOCK:
putchar(‘s‘);//网络套接字文件
break;
case S_IFLNK:
putchar(‘l‘);//链接文件
break;
case S_IFBLK:
putchar(‘b‘);//块设备文件
break;
case S_IFCHR:
putchar(‘c‘);//字符设备文件
break;
case S_IFIFO:
putchar(‘p‘);//管道文件
break;
default:
break;
}
//判断文件权限
if(m_stat.st_mode & S_IRUSR)
putchar(‘r‘);
else
putchar(‘-‘);
if(m_stat.st_mode & S_IWUSR)
putchar(‘w‘);
else
putchar(‘-‘);
if(m_stat.st_mode & S_IXUSR)
putchar(‘x‘);
else
putchar(‘-‘);
//显示硬连接数
printf(" %ld ",m_stat.st_nlink);
//文件拥有者姓名
pwd = getpwuid(m_stat.st_uid);
printf(" %s ",pwd->pw_name);
//文件所属组姓名
grp = getgrgid(m_stat.st_gid);
printf(" %s ",grp->gr_name);
//总字节个数
printf("% ld ",m_stat.st_blocks);
//获取文件的时间
tmp = localtime(&m_stat.st_mtim.tv_sec);
if(tmp == NULL)
return 1;
strftime(buf,BUFSIZE,"%m月 %d %H:%M", tmp);
printf("%s",buf);
//输出文件名
printf(" %s",path);
printf("\n");
}
int mydir(const char *path)
{
DIR *dp = NULL;
struct dirent *entry = NULL;
struct stat m_stat;
if (lstat(path,&m_stat) < 0)//判断lstat函数是否成功
{
return 1;
}
if(!S_ISDIR(m_stat.st_mode))//判断所打开的文件是不是目录文件
{
return 1;
}
dp = opendir(path);
if(dp==NULL)
{ //perror("opendir()");
return 1;
}
while(1)
{
entry = readdir(dp);
if(entry == NULL)
{
if(errno)
{
// perror("readdir()");
closedir(dp);
return 1;
}
break;
}
printf("%s\n",entry->d_name);
}
closedir(dp);
return 0;
}
int main(int argc,char *argv[])
{
char *optstring = "-a:l:i:h:";
int c;
int re;
struct stat cur_stat;
if(argc < 2)
return 1;
while(1)
{
c = getopt(argc,argv,optstring);
if(c==-1)
break;
switch(c)
{
case ‘a‘:re= mydir(optarg);//打开所有文件
if(re == 1)
{
printf("error!\n");
}
break;
case ‘l‘:if(re == mystat(optarg))//打印文件详细信息
printf("error!\n");
break;
case ‘i‘: stat(optarg,&cur_stat);//打印文件iNode号
printf("%ld\n",cur_stat.st_ino);
break;
case ‘h‘:re = myblock(optarg);//打印文件大小
if(re == -1)
printf("error!\n");
else
printf("%d k \n",re);
break;
case ‘?‘:printf("不认识此选项%s\n",argv[optind-1]);
}
}
return 0;
}
标签:reg def 网络 数组 硬连接 col lin 隐藏 tar
原文地址:https://www.cnblogs.com/csh081116/p/10538205.html