#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. Vue从零开始(一)

    一.什么是Vue? Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层 ...

  2. Java新集合示意图

    Java的新集合实际上只有3个集合组件:①Map ②List ③Set 在Java 1.2后应该尽量避免使用Hashtable,Vector 和Stack: 假如在一个列表中部进行大量的插入和删除操作 ...

  3. 分布式环境下rabbitmq发布与订阅端

    假设rabbitmq配置了集群,且客户端连接rabbitmq-server通过lvs实现HA但一般情况下不建议做LB.在分布式系统的环境下,由于节点的非预知性,使用spring amqp模板进行配置不 ...

  4. Java基础学习总结--对象容器

    目录: ArrayList 顺序泛型容器 HashSet 集合容器 HashMap<Key,Value>容器 要用Java实现记事本的功能.首先列出记事本所需功能: 可以添加记录(字符串) ...

  5. Permit.js – 用于构建多状态原型的 jQuery 插件

    Permit.js 是一个 jQuery 插件,用于构建交互的,多态的网站原型和应用程序原型.也许你的网站有的功能仅适用于登录的成员,只有管理员才能使用或者你的应用程序会根据线上或离线有不同的功能,这 ...

  6. Grid – 入门必备!简单易懂的响应式设计指南

    如今,人们使用各种各样的移动设备访问网页,设计师们需要去适配不同的屏幕,让用户在都能有最佳的浏览体验.Grid 是一个简单的响应式设计指南,按照这些简单的步骤,你的就能够掌握基础的响应网页设计技巧. ...

  7. DevExpress v15.2.4帮助文档下载(全)

    原文地址:http://www.devexpresscn.com/Resources/Documentation-498.html DevExpress v15.2帮助文档下载列表大全来啦!包含.ne ...

  8. Oracle11g 统计信息——统计信息自动收集任务

    参考文献: Oracle11g 统计信息(一)-----统计信息自动收集任务 背景: 在使用cacti监控oracle数据库IO的时候发现每天晚上10点钟的时候oracle数据库读写明显增加,如下图所 ...

  9. Java虚拟机JVM学习07 类的卸载机制

    Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...

  10. 操作系统开发系列—13.c.进程之中断重入

    现在又出现了另外一个的问题,在中断处理过程中是否应该允许下一个中断发生? 让我们修改一下代码,以便让系统可以在时钟中断的处理过程中接受下一个时钟中断.这听起来不是个很好的主意,但是可以借此来做个试验. ...