`
linguanghuan
  • 浏览: 4015 次
社区版块
存档分类
最新评论

myls.c 读目录

 
阅读更多

 

#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
        DIR *dp;
        struct dirent *dirp;
        if (argc != 2)
        {
                printf("usage: ls directory_name\n");
                exit(1);
        }
        if ((dp = opendir(argv[1])) == NULL)
        {
                printf("can't open %s\n", argv[1]);
                exit(1);
        }
        while ((dirp = readdir(dp)) != NULL)
        {
                printf("%s\n", dirp->d_name);
        }
        closedir(dp);
        exit(0);
}

 

 

编译 
[lingh@test advanced_unix]$ gcc -o myls myls.c
[lingh@test advanced_unix]$ ls
myls myls.c

 

myls运行结果 

[lingh@test advanced_unix]$ myls
usage: ls directory_name
[lingh@test advanced_unix]$ myls .
..
myls
myls.c
.
[lingh@test advanced_unix]$ myls /
root
tmp
selinux
bin
sbin
proc
home
misc
ora
net
usr
etc
var
dev
media
opt
lib
.
lost+found
lib64
..
.autofsck
boot
mnt
sys
srv
cgroup

 

 知识点整理:

 

  1. DIR, struct dirent, opendir(), readdir()  需要包含头文件 dirent.h

  2. exit() 需要包含头文件stdlib.h

  3  DIR *opendir(const char *pathname);   

         成功返回指针,失败返回NULL

  4  struct dirent * readdir(DIR *dp);

         成功返回指针,若在目录结尾或者出错返回NULL, 参数dp为opendir函数的返回值

      opendir执行初始化操作,使第一个readdir读取目录中的第一个目录项。目录中的各目录项的顺序与实现有关。它们通常并不按字母顺序排列。

 

 5.

     struct dirent{

          ino_t d_ino;

          char d_name[NAME_MAX+1];

      }

dirent 至少包含以下2项:

      d_ino: i-node值

      d_name: 文件名

 

实际这个结构体的定义是在bits/dirent.h文件中

[lingh@test include]$ grep -rn "struct dirent" *

bits/dirent.h:23:struct dirent

内容如下:

 

struct dirent
  {
#ifndef __USE_FILE_OFFSET64
    __ino_t d_ino;
    __off_t d_off;
#else
    __ino64_t d_ino;
    __off64_t d_off;
#endif
    unsigned short int d_reclen;
    unsigned char d_type;
    char d_name[256];           /* We must not include limits.h! */
  };

 

struct dirent
{
long d_ino; /* inode number 索引节点号 */
off_t d_off; /* offset to this dirent 在目录文件中的偏移 */
unsigned short d_reclen; /* length of this d_name 文件名长 */
unsigned char d_type; /* the type of d_name 文件类型 */
char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长256字符 */
}

 

 

 

#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
        DIR *dp;
        struct dirent *dirp;
        if (argc != 2)
        {
                printf("usage: %s directory_name\n", argv[0]);
                exit(1);
        }
        if ((dp = opendir(argv[1])) == NULL)
        {
                printf("can't open %s\n", argv[1]);
                exit(1);
        }
        while ((dirp = readdir(dp)) != NULL)
        {
                printf("d_name:%s\td_ino:%d\td_reclen:%d\td_type[d]:%d\td_type[c]:%c\n", dirp->d_name, dirp->d_ino, dirp->d_reclen, dirp->d_type, dirp->d_type);
        }
        closedir(dp);
        exit(0);
}

 

 printf("usage: %s directory_name\n", argv[0]);

不写死提示,argv[0]代表可执行文件本身,这样可以编译结果可以灵活指定可执行文件的名称

ll -a 和 myls结果比较 
[lingh@test advanced_unix]$ ll -a
总用量 20
drwxrwxr-x. 2 lingh lingh 4096 4月 23 21:01 .
drwxr-xr-x. 7 lingh lingh 4096 4月 23 21:01 ..
-rwxrwxr-x. 1 lingh lingh 7406 4月 23 21:01 myls
-rw-rw-r--. 1 lingh lingh 511 4月 23 21:01 myls.c

 

myls结果 
[lingh@test advanced_unix]$ myls .
d_name:.. d_ino:1569793 d_off:2261691002226484046 d_reclen:24 d_type[d]:4 d_type[c]:
d_name:myls d_ino:1569795 d_off:4147461195343482675 d_reclen:24 d_type[d]:8 d_type[c]:
d_name:myls.c d_ino:1571816 d_off:7804648911474585207 d_reclen:32 d_type[d]:8 d_type[c]:
d_name:. d_ino:1571813 d_off:9223372036854775807 d_reclen:24 d_type[d]:4 d_type[c]:

 

参考:

1. unix 高级环境编程 第二版  p4,p120

2. 百度百科:dirent

 

 

 

0
0
分享到:
评论

相关推荐

    linux C 编程 myls.c

    在linux系统下,用C编程实现自己的ls功能

    implemetation of myls -al

    myls using C. option is -a , -l. colors are added for readability. how to run : $./myls [destination]

    MyLS.rar_MATLAB编程_最小二乘法

    最小二乘法Matlab编程实现//最小二乘法Matlab编程实现

    linux C实现ls命令

    用与目录操作相关的系统调用及库函数实现Linux下的ls 命令。

    自己写的linux的ls指令

    例如:当前目录包含文件home1.c、home2.c、.home3.c,输入myls -a后,列出所有的文件名为home1.c, home2.c, .home3.c. (3) myls –l: 列出当前文件夹下普通文件的详细信息,包括文件模式,文件链接数,文件所属用户...

    高级环境编程之myls

    myls项目试图复制这个功能,帮助开发者了解如何在底层处理文件和目录操作。下面我们将详细探讨myls实现中可能涉及的关键知识点: 1. **文件操作**:myls的实现肯定包含了打开、读取、遍历和关闭文件的操作。在C语言...

    linux ls命令实现

    `myls`命令的主要功能是列出当前目录或指定目录下的文件和子目录。它模仿了原版`ls`命令的部分功能,如 `-R` 和 `-l` 选项。 2. **-R 选项**: `-R` 选项用于递归列出所有子目录中的文件。实现这个功能需要遍历...

    Unix编程编写myls(-alrt)命令

    编写完成后,通过测试各种不同场景来确保 `myls` 命令的正确性和稳定性,比如空目录、含有大量文件的目录、包含子目录的目录等。 总的来说,这个项目是一个很好的练习,可以让你深入理解Unix文件系统、进程间通信、...

    编写程序mycp.c,实现从命令行读入文件的复制功能,用原始文件系统调用。

    程序主要依赖于C语言标准库函数以及Linux系统调用函数来完成文件操作。 ### 2. 头文件与宏定义 #### 2.1 头文件 - `#include&lt;stdio.h&gt;`:引入标准输入输出头文件,主要用于错误信息的打印。 - `#include&lt;sys/types...

    myls:实现linux下的ls命令部分功能

    通过编写`myls`,学习者能够深入理解Linux内核如何处理文件和目录,以及如何利用C语言进行系统级编程。这个过程不仅涵盖了基本的文件操作,还涉及到了进程、内存管理、信号处理等多个方面,对于提升系统编程能力...

    (源码)基于C语言的文件管理系统.zip

    # 基于C语言的文件管理... myls显示当前目录内容。 mycd更改当前目录。 3. 文件操作 mycreate创建文件。 myopen打开文件。 myclose关闭文件。 mywrite写入文件。 myread读取文件。 myrm删除文件。 4. 系统退出

    myls浪子提供的一个聊天室很不错的聊天室.rar

    "myls浪子提供的一个聊天室很不错的聊天室.rar" 这个标题揭示了我们正在处理的是一个由用户"myls浪子"分享的压缩文件,该文件是一个聊天室软件或者相关资源的集合。"rar"是文件的格式,表明这是一个RAR压缩文件,...

    linux系统下ls命令的简单实现

    1. `ls.c`: 这很可能是实现`ls`功能的C语言源代码。在其中,你会看到如何调用系统调用来获取目录信息,并处理各种选项。 2. `main.c`: 这是程序的主入口点,通常包含`main`函数,负责接收命令行参数,解析它们并调用...

    UNIX环境高级编程

    这些Shell各有特色,例如Bourne Shell以其强大的脚本能力著称,C Shell则提供了一些类似C语言的语法特性,而Korn Shell结合了前两者的特性。 2. UNIX文件系统:文件系统是UNIX操作系统存储和组织文件的核心部分。...

    资源管理器

    这个特定的项目是一个基于C语言实现的资源管理器,名为"MyLs"。C语言是一种底层编程语言,它允许开发者直接与硬件交互,因此是构建操作系统组件和系统级工具的理想选择。 在Linux环境下,"ls"命令是最基础的文件和...

    最小二乘拟合Gauss曲线Matlab

    6. `myLs.m`:这可能是最小二乘法的核心实现,计算残差平方和并求解最优参数。 7. `myTrans.m`:可能涉及到矩阵变换,如雅可比矩阵的转置。 8. `calDet.m`:计算行列式,可能在确定矩阵是否可逆或求解逆矩阵时使用。...

    实验五 复制文件

    完成一个目录复制命令mycp,包括目录下的文件和子目录, 运行结果如下: 说明: Linux: creat,read,write等系统调用,要求支持软链接 Windows: CreateFile(), ReadFile(), WriteFile(), CloseHandle()等函数

    目录与文件属性ls

    a对输出的文件、目录进行排序(如按文件名排、按修改时间排、按类型排), b分栏(输出支持一行多栏), c“.”开头文件(默认隐藏这类文件), d支持参数(如可以执行./myls /tmp); e支持更多选项(阅读man ls,...

    unix ls命令实现

    现在我们将深入探讨如何使用C语言实现`ls -l`的功能。 首先,我们需要理解Unix文件系统的基本概念。在Unix中,一切皆为文件,包括硬件设备、目录和普通文件。文件系统以树状结构组织,根目录(/)位于顶部,其他...

Global site tag (gtag.js) - Google Analytics