#include<stdio.h>
#include<dirent.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>

/*
 * $ls -la ~
 * total 460
 * drwxr-xr-x 31 linux linux  4096 10月 27 17:27 .
 * drwxr-xr-x  3 root  root   4096  9月 22  2012 ..
 * -rw-------  1 linux linux  3126 10月  5 12:56 altvimrc
 * -rw-rw-r--  1 linux linux   102 10月 27 11:31 .apport-ignore.xml
 * -rw-------  1 linux linux 20110 10月 27 15:47 .bash_history
 * -rw-r--r--  1 linux linux   220  9月 22  2012 .bash_logout
 */
int main(int argc, const char *argv[])
{
    //打开目录流
    //循环读取其中的文件名,
    //将文件名使用stat()读取属性,并做相应解析
    //写入到文件
    DIR* dp=opendir(".");
    struct dirent* Dir;
    struct stat File;
    while(Dir=readdir(dp)){
        stat(Dir->d_name,&File);
        char prot[11]={0};
        //获取文件类型并解析
        switch (File.st_mode&S_IFMT){
        case S_IFSOCK:
            strcpy(prot,"s");
            break;
        case S_IFLNK:
            strcpy(prot,"l");
            break;
        case S_IFREG:
            strcpy(prot,"-");
            break;
        case S_IFBLK:
            strcpy(prot,"b");
            break;
        case S_IFDIR:
            strcpy(prot,"d");
            break;
        case S_IFCHR:
            strcpy(prot,"c");
            break;
        case S_IFIFO:
            strcpy(prot,"p");
            break;

        }
        //获取文件权限并解析
        //处理属主权限
        if(S_IRUSR==((File.st_mode&S_IRWXU)&S_IRUSR))
            strcat(prot,"r");
        else
            strcat(prot,"-");
        if(S_IWUSR==((File.st_mode&S_IRWXU)&S_IWUSR))
            strcat(prot,"w");
        else
            strcat(prot,"-");
        if(S_IXUSR==((File.st_mode&S_IRWXU)&S_IXUSR))
            strcat(prot,"x");
        else
            strcat(prot,"-");

        //处理属组权限
        if(S_IRGRP==((File.st_mode&S_IRWXG)&S_IRGRP))
            strcat(prot,"r");
        else
            strcat(prot,"-");
        if(S_IWGRP==((File.st_mode&S_IRWXG)&S_IWGRP))
            strcat(prot,"w");
        else
            strcat(prot,"-");
        if(S_IXGRP==((File.st_mode&S_IRWXG)&S_IXGRP))
            strcat(prot,"x");
        else
            strcat(prot,"-");

        //处理其他权限
        if(S_IROTH==((File.st_mode&S_IRWXO)&S_IROTH))
            strcat(prot,"r");
        else
            strcat(prot,"-");
        if(S_IWOTH==((File.st_mode&S_IRWXO)&S_IWOTH))
            strcat(prot,"w");
        else
            strcat(prot,"-");
        if(S_IXOTH==((File.st_mode&S_IRWXO)&S_IXOTH))
            strcat(prot,"x");
        else
            strcat(prot,"-");
        //获取文件硬链接数
        //获取文件属主的名
        struct passwd* pwd=getpwuid(File.st_uid);
        //获取文件属主的组名
        struct group* grp=getgrgid(File.st_gid);
        //获取文件的大小
        //获取文件的mtime
        struct tm* myTime;
        myTime=localtime(&File.st_mtime);
        printf("%s %d %s %s %5ld %d月 %d %02d:%02d %s\n",
                prot,
                File.st_nlink,
                pwd->pw_name,
                grp->gr_name,
                File.st_size,
                myTime->tm_mon+1,
                myTime->tm_mday,
                myTime->tm_hour,
                myTime->tm_min,
                Dir->d_name
                );
    }
    return 0;
}

my_ls的更多相关文章

  1. (笨方法)利用stat函数实现ls -l filename

    学习了一段时间的Linux了,但是我感觉我做不出来啥子,后头选择利用系统IO函数实现命令,先从ls走起吧.先来看看ls -l filename给我们显示了什么吧 : 可以看到,一共八项:文件类型.用户 ...

  2. 【操作系统】C语言编写的FAT16文件系统

    [操作系统]C语言编写的FAT16文件系统 这是操作系统的期末课程设计作业之一,主要功能是在物理内存中虚拟出一个1M大小的FAT16的文件系统,然后把它读入内存中,进行具体的文件操作,具体的实用性不大 ...

  3. python传参

    写在前面 Python唯一支持的参数传递方式是『共享传参』(call by sharing) 多数面向对象语言都采用这一模式,包括Ruby.Smalltalk和Java(Java的引用类型是这样,基本 ...

  4. Python传入参数的几种方法

    写在前面 Python唯一支持的参数传递方式是『共享传参』(call by sharing) 多数面向对象语言都采用这一模式,包括Ruby.Smalltalk和Java(Java的引用类型是这样,基本 ...

随机推荐

  1. 第 27 章 CSS 传统布局[下]

    学习要点: 1.定位布局 2.box-sizing 3.resize 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS 早期所使用的传统布局,很多情况下,这些布局方式还是非常有用的. 一.定位布 ...

  2. 面试问题整理笔记系列 一 Java容器类

                                               虚线框表示接口:实线框表示实体类:粗线框表示最常用的实体类:虚线箭头表示实现了这个接口:实现箭头表示类可以制造箭头 ...

  3. 修改thinkphp路由模式,去掉Home

    第一步:入口文件增加 define('BIND_MODULE', 'Home'); 第二步:修改config文件,我这里路由模式设置为2 效果展示:

  4. javascript模板库jsrender加载并缓存外部模板文件

    前一篇说了jsrender嵌套循环的使用,在SPA的应用中,广泛使用的一个点就是view模板,使用了SPA之后,每个业务页面不再是独立的html,仅仅是一个segment,所以通常这些segment会 ...

  5. web桌面程序之图标拖动排序的分析

    在web桌面程序里,图标拖动并重新排序是个比较常见的功能.这个功能我之前反复修改了好几遍,现在终于整理出了比较理想的解决思路,决定拿出来分享下. 这一功能主要有哪些难点呢?我总结了一下一共有2处难点: ...

  6. HTML5 学习笔记(五)——WebSocket与消息推送

    B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链 ...

  7. 基于 Bootstrap 的响应式后台管理面板

    你想建立一个后台管理面板或者分析仪表板吗?不需从头开始,Keen IO Bootstrap 是一个响应式的仪表盘模板,可以帮助你在几分钟内呈现数据,让你可以创建一个有吸引力的,定制的分析仪表板,随时可 ...

  8. CSS高级选择符

    2016-11-07 <css入门经典>第八章 1.属性选择器 选择器 描述 [attribute] 用于选取带有指定属性的元素. [attribute=value] 用于选取带有指定属性 ...

  9. 【再探backbone 02】集合-Collection

    前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...

  10. js一些代码方法

    概要 1.替换json对象中属性值(包括子对象) 2.兼容多个$库写法(zepto与jquery) 3.闭包保持变量的做法 详情 1.替换json对象中属性值(包括子对象) //替换json对象属性值 ...