#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. 算法:欧几里得求最大公约数(python版)

    #欧几里得求最大公约数 #!/usr/bin/env python #coding -*- utf:8 -*- #iteration def gcd(a,b): if b==0: return a e ...

  2. C语言Scanf函数

    C语言的scanf函数 一.变量的内存分析 (一)字节与地址 ①. 内存以字节为单位 每个字节都有自己的内存地址,根据地址就可以找到该字节.整个内存相当于一整个酒店,而酒店以房间为单位,在这里每个房间 ...

  3. DDD开发框架ABP之本地化/多语言支持

    本地化(Localization)也就是多语言功能,借此用户能够选择他的母语或熟悉的语言来使用系统,这显然非常有利于软件系统推向国际化.一个应用程序的UI界面至少有一种语言,DDD开发框架ABP就提供 ...

  4. Redis-复制

    Redis 的复制 (replication) 是一种使用和配置起来非常简单的主从(master-slave)复制,允许 Redis 从服务器成为主服务器的精确副本.以下是关于 Redis 复制的一些 ...

  5. 在 Windows 上遇到非常多 TIME_WAIT 連線時應如何處理

        我們公司所代管的網站裡,有幾個流量是非常大的,在尖峰的時刻同時上線人數可能高達數千到數萬人,而在這個時候如果使用 netstat 或 TCPView 查看所有 TCP 連線時就會看到非常多處於 ...

  6. SQL Server 行转列重温

    转载自http://www.cnblogs.com/kerrycode/ 行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER ...

  7. 哇 真的是一个好插件!!!Sublime Text编辑文件后快速刷新浏览器

    http://9iphp.com/web/html/sublime-text-refresh-browser.html这篇博文咯 来源:[Tips]Sublime Text编辑文件后快速刷新浏览器 - ...

  8. Nibbler – 免费的网站测试和指标评分工具

    Nibbler 是一款免费的工具,用于测试网站的各个方面指标.输入任意网站的地址,Nibbler 会给你一份报告,列出网站的10个关键领域的分数,包括可访问性,用户体验,搜索引擎优化,社交媒体和技术等 ...

  9. 为Titanium创建自己的安卓推送模块

    在手机应用中,推送是一个非常重要的功能.相对来说ios应用的推送功能很容易做,因为它统一都是用苹果的APNS服务实现的.但安卓这边就比较混乱了,虽然谷歌也推出了类似苹果的官方推送服务,但由于谷歌的服务 ...

  10. 调用没有在AndroidManifest.xml注册过的Activity,报出的错误提示