#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. 第 23 章 CSS3 边框图片效果

    学习要点: 1.属性初探 2.属性解释 3.简写和版本 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS3 中边框图片背景的效果,通过这个新属性让边框更加的丰富多彩. 一.属性解释 CSS3 提 ...

  2. redis事务详解

    mysql中也存在事务的概念.其实事务的定义是一样的.一组操作的集合,作为一个整体,要么全执行,要么全不执行. redis设置事务三步骤: 开始事务 :multi 操作加入事务队列 执行事务 :exe ...

  3. 项目中应用eventbus解决的问题

    在项目开发过程中,往往有些功能表面看起来简单,但实际开发的结果非常复杂,仔细分析下原因发现很多都是因为附加了许多的额外功能. 真的简单吗? 比如我们对一个电商平台的商品数据做修改的功能来讲,其实非常简 ...

  4. Spring4学习笔记2-配置Bean

    1.配置bean 配置形式:Xml和注解方式 Bean的配置方式:通过全类名(反射).工厂.FactoryBean 1.1 id必须唯一 2 Spring提供两种类型的IOC容器的实现 BeanFac ...

  5. 使用虚拟按钮(Ghost Buttons)的25个网站

    2014年已经过去大半年了,我们看到网页设计领域出现新的设计趋势. 虚拟按钮(Ghost Buttons)是指具备基本的按钮形状的透明按钮,但有细实线的边框.有些虚拟钮是互动的,点击之后按钮可能会成为 ...

  6. HTML表单提交数据中application/x-www-form-urlencoded和multipart/form-data的区别

    在Form元素的语法中,EncType表明提交数据的格式 用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型. 下边是说明: application/x-www-form-urlen ...

  7. 【iScroll源码学习02】分解iScroll三个核心事件点

    前言 最近两天看到很多的总结性发言,我想想今年好像我的变化挺大的,是不是该晚上来水一发呢?嗯,决定了,晚上来水一发! 上周六,我们简单模拟了下iScroll的实现,周日我们开始了学习iScroll的源 ...

  8. easyui1.3.2中使用1.3.6或1.4.x的calendar

    首先在1.3.2中calendar控件不支持日历某天的颜色进行改变,和自定义回调函数 Name Type Description Default width number The width of c ...

  9. jquery easyui tabs单击刷新右键刷新

    单击刷新 $(".tabs-inner").click(function(){var currTab = self.parent.$('#tabs').tabs('getSelec ...

  10. JavaScript基础18——js的Array对象

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...