在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 命令的主要内容,如果未能解决你的问题,请参考以下文章