实现ls -l

就是遍历一个目录下面的所有文件,显示信息

Linux下面有点绕

要通过 opendir打开目录,返回一个DIR结构

用readdir来读DIR结构,返回目录下面的第一项,是个dirent结构体,再次调用readdir回读到第二项,以此类推

dirent结构体里面有该文件的文件名,通过stat可以获得该文件的详细信息。

注意stat结构要malloc一下,不然后segment fail??好像是这个单词。可能是没有分配的话指针会乱指。

读写执行权限在mode_t里面,没有直接输出的函数,要自己写一个,判断有没有该权限,用与运算,不是判等。

其它信息都在stat里面,这里只输出了st_mode。

#include<dirent.h>
#include<stdio.h>
#include<sys/stat.h>
#include <fcntl.h>

void show(mode_t mode){

    if(mode&S_IRUSR)
        printf("r");
    else
        printf("-");

    if(mode&S_IWUSR)
        printf("w");
    else
        printf("-");

    if(mode&S_IXUSR)
        printf("x");
    else
        printf("-");

    /*********Group********/

    if(mode&S_IRGRP)
        printf("r");
    else
        printf("-");

    if(mode&S_IWGRP)
        printf("w");
    else
        printf("-");

    if(mode&S_IXGRP)
        printf("x");
    else
        printf("-");

    /**********Else***************/

    if(mode&S_IROTH)
        printf("r");
    else
        printf("-");

    if(mode&S_IWOTH)
        printf("w");
    else
        printf("-");

    if(mode&S_IXOTH)
        printf("x");
    else
        printf("-");

    printf("\n");

}

int main(int argc,char * argv[]){

    DIR *dp;
    struct dirent* dir;
    struct stat * buf = (struct stat *)malloc(sizeof(struct stat));
    int fd;

    dp = opendir(argv[1]);

    while((dir = readdir(dp))!=NULL){

        printf("%s    ",dir->d_name);
        //fd = open(dir->d_name,O_RDWR);
        //fstat(fd,buf);
        stat(dir->d_name,buf);
        show(buf->st_mode);

    }

    printf("Done!!!!\n");

}
时间: 2024-10-13 00:55:21

实现ls -l的相关文章

标准IO的简单应用,动静态库,读取系统时间并打印,模拟ls -l功能

2015.2.27星期五,小雨 标准IO实现的复制功能: #include <stdio.h>#include <errno.h> #define N 64 int main(int argc, char *argv[]){ int n; char buf[N]; FILE *fps, *fpd; if(argc < 3) { printf("usage : %s <src_file><dst_file>\n",argv[0]);

编程实现Linux下的ls -l

头文件 #ifndef __FUNC_H__ #define __FUNC_H__ #include<stdio.h> #include <stdio.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #inc

linux中ls、ls -l、ls -al、ll命令

ls只是简单的列出目录下文件名,ll更加详细的列出了文件的类型.文件所有者权限.文件所有者组权限.文件大小.文件最后修改时间,etc... 我们可以用一个简单的图来说明,如下图1: 图1 1.第一位就"-",表示普通文件. 2.rw- ,表示文件所有者对Text.txt文件有读.写权限,(x位置为"-"表示没有执行权限) 3.rw- ,表示文件所有者所在组对Text.txt文件有读.写权限,(x位置为"-"表示没有执行权限) 4.r--  ,表示

linux ls -l 详解[转]

linux ls -l 详解[转] 有几个字段老是记不住,就记载这里吧 ls -l 列表信息详解 我们平时用ls -l 命令查看一个目录下的文件和子目录的详悉信息时,会得到一个详细的文件和目录名列表.这个列表包含了文件的属性,所属用户,所属组,创建时间,文件大小等等信息.这些信息到底是什么意思呢?有很多初学者对这些不太了解,因此想详悉讲解一下用ls -l命令得到的文件列表每一个字段的意思 以笔者电脑的/root目录为例: [[email protected] root]# ll 总用量 4055

linux命令ls -l的total是怎么计算出来的?

自己手写实现ls -l命令纠结了很久的地方,刚才总算搞明白了.直接上代码重要部分 long nTotalBlocks = 0; DIR* dp = opendir(dirPathName); struct dirent* dirp; while ((dirp = readdir(dp)) != NULL) { lstat(fullPath, &sbuf); long nBlocks = sbuf.st_size / 4096; if (sbuf.st_size % 4096 > 0) nBl

Linux&amp;C编程之Linux系统命令“ls -l”的简单实现

一.基础知识: 1.获取文件详细信息的函数: (1).获取文件信息的函数: #include<sys/stat.h> int stat(const char * path,struct stat * buf);/*将path参数(文件或目录)的文件信息写到buf中,buf为传出参数*/ (2).文件信息结构体: /*用不到的成员被注释掉,只需了解需要的成员即可*/ struct stat{ //dev_t st_dev;/*设备id号*/ //ino_t st_ino;/*i节点号*/ mod

【转】linux ls -l的详解

原文:http://blog.csdn.net/sjzs5590/article/details/8254527 以root的家目录为例: 可以看到,用ls -l命令查看某一个目录会得到一个7个字段的列表. 第1行:总计(total) Total后面的数字是指当前目录下所有文件所占用的空间总和.可以使用ls –lh查看,也可使用ls –alh查看. 第1字段: 文件属性字段 -rw-r--r-- 1 root root 762 07-29 18:19 exit 文件属性字段总共有10个字母组成:

实现Linux下的ls -l命令

基本实现了Linux下的ls -l命令,对于不同的文件显示不同的颜色和显示符号链接暂时没有实现: 1 /************************************************************************* 2 > File Name: dirwalk.c 3 > Author: 4 > Mail: 5 > Created Time: Tue 31 Mar 2015 11:56:38 AM CST 6 ******************

设置ll和ls -l命令中显示的日期格式

在Linux中使用ll或者ls -l命令过程中,日期的显示总是显示英文日期,觉的很不爽,那么怎么设置显示的格式是按照我们定义的呢? 1.临时更改显示样式,当回话结束后恢复原来的样式 export TIME_STYLE='+%Y-%m-%d %H:%M:%S'    # 直接在命令中执行即可 2.永久改变显示样式,更改后的效果会保存下来 修改/etc/profile文件,在文件内容末尾加入     export TIME_STYLE='+%Y-%m-%d %H:%M:%S' 执行如下命令,使你修改

ls -l显示的内容中total到底是什么?

当我们在使用ls -l的命令时,我们会看到如下类似的信息. 图1 很多人可能对于图一第一行的total 12的数值并不是很在意,但是你是否想过,它究竟是什么意思? man中的说明,我们可以看出total的意思为 "所列出内容的磁盘占用空间总和值.单位为kbytes"这句话是什么意思? 我们知道ls -l列出的第5列数值是该文件或目录的大小.在这里目录的大小并非是目录所包含的文件的总大小.而仅仅是目录自身的大小. 如果你无法理解这一概念,请思考一下"linux中一切皆文件&qu