在Linux下:用 C 语言实现 ls 命令

Posted ITAK

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Linux下:用 C 语言实现 ls 命令相关的知识,希望对你有一定的参考价值。

这次主要的目的是用 C语言 实现 Linux 系统中的 ls 命令。

在编写命令之前,需要介绍一下几个结构体:

第一个 DIR

struct __dirstream

    void *__fd;
    char *__data;
    int  __entry_data;
    char *__ptr;
    int __entry_ptr;
    size_t __allocation;
    size_t __size;
    __libc_lock_define (, __lock)
;
typedef struct __dirstream DIR;

然后还有几个对应的函数:

首先定义一个 DIR 类型的指针变量 DIR *dir;

1.打开文件:

DIR *opendir(const char *pathname)
这里面的参数就是想打开文件的路径名字
例如:dir = opendir(".");//其中 . 表示的是当前目录

2.关闭文件:

closedir(dir);
//dir变量表示的是用于打开文件的那个变量:

3.读文件:

struct dirent *readdir(dir);   
然后这里面又牵扯到另一个结构体: struct dirent 这个一会儿再说

4.rewinddir

作用:用来设置参数dir目录流目前的读取位置为原来开头的读取位置,没有返回值的函数。
—摘自百度百科

void rewinddir(dir);

5.seekdir
作用:用来设置参数 dir 目录流目前的读取位置,在调用 readdir() 时便从此新位置开始读取。参数 offset 代表距离目录文件开头的偏移量—摘自百度百科

void seekdir(dir,long offset);  

6.telldir
作用:此函数是一个函数名,作用是用于记录着一个目录流的位置。—摘自百度百科
关于 DIR 结构,主要知道这几个函数就OK了,其实在本代码中就只用到了 第一个、第二个和第三个。
下面在来介绍一个结构体:struct dirent

struct dirent

   long d_ino; /* 索引节点号 */
   off_t d_off; /*在目录文件中的偏移 */
   unsigned short d_reclen; /*文件名长 */
   unsigned char d_type; /* 文件类型 */
   char d_name [NAME_MAX+1]; /* 文件名,最长255字符 */

在本代码中也用到了 d_name 这个成员变量
然后基础的知识大体上就是这么多了,剩下的就是实现 Linux 系统中 ls 命令代码了:
就是用 opendir 函数打开当前的目录,然后定义一个struct dirent *rent 指针变量,当进行 readdir 这个读函数的时候,就将 rent 指针指向读函数返回的那个指针,然后这里写代码片`rent-<d_name 就行了,最好closedir(dir); 关闭文件,这样就大体上写好了,但是这个命令执行的是 ls - a 的命令,也就是将所有的文件以及目录包括隐藏的文件也给输出出来了,我们就可以进行一些修饰的操作,将其显示 ls 的命令,最好还需要进行排一下序,显得 ls 命令差不多:

大体上代码就写完了,其实在 Windows 系统下也是可以执行的。
My Code:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#include <sys/types.h>
#include <algorithm>
using namespace std;
bool cmp(string a, string b)
    return a < b;

int main()
    //struct __dirstream  typedef struct __dirstream DIR;  
    DIR *dir;
    char str[100];
    string res[100];
    struct dirent *rent;//struct
    dir = opendir(".");
    int cnt = 0;
    while((rent=readdir(dir)))
        strcpy(str, rent->d_name);
        if(str[0] == '.')
            continue;
        if(!str)
            continue;
        //printf("%s  ", str);
        res[cnt++] = str;
    
    //cout<<"cnt = "<<cnt<<endl;
    sort(res, res+cnt, cmp);
    for(int i=0; i<cnt; i++)
        cout<<res[i]<<"  ";
    puts("");
    closedir(dir);
    return 0````````


windows 系统下的运行截图:

Linux 系统下的运行截图

以上是关于在Linux下:用 C 语言实现 ls 命令的主要内容,如果未能解决你的问题,请参考以下文章

怎样使用C语言列出某个目录下的文件?

Linux ls命令详解

Linux列出当前目录下的文件和目录用啥命令

在Linux下安装和卸载软件

linux下 为啥ls -l命令 和ls -sh 、du 显示文件的大小不一样?

#yyds干货盘点#ls命令按时间排序