码迷,mamicode.com
首页 > 其他好文 > 详细

chen

时间:2019-03-15 17:39:58      阅读:118      评论:0      收藏:0      [点我收藏+]

标签: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;
}

chen

标签:reg   def   网络   数组   硬连接   col   lin   隐藏   tar   

原文地址:https://www.cnblogs.com/csh081116/p/10538205.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!