前言
ls
命令使我们每天频繁的使用,ls
可以轻松的列出这个一个目录下所有的文件
和目录
.
我们现在就来实现一个最简单的目录命令ls
.
代码 Git 地址 SuzhenProjects/ApueProject
ls 命令初探
我在
Home
目录下执行了 ls
指令,可以清晰的看到,所有的文件,和目录,都被列了出来.
ls 命令浅析
-
ls
命令支持输入一个目录地址 - 读取该名录的信息,循环列出所有
档案
的信息
说干就干
//
// Created by suzhen on 03/01/2018.
//
#include <dirent.h>
#include <cstdio>
#include <cstring>
#include <cerrno>
int main(int argc, char **argv) {
if (argc != 2) {
printf("bad usage!!!");
return 1;
}
const char *targetDirPath = argv[1];
printf("open targetDir %s\n", targetDirPath);
DIR *targetDir = nullptr;
if ((targetDir = opendir(targetDirPath)) == nullptr) {
printf("error! %s\n", strerror(errno));
return 2;
}
for (dirent *dir = nullptr; (dir = readdir(targetDir)) != nullptr;) {
printf("%s\n", dir->d_name);
}
closedir(targetDir);
return 0;
}
我们使用 C++ 来编写第一段程序,很多人知道意义,我们也不妨重新温习
注意main
函数的声明
argc | argv |
---|---|
参数个数 | 参数字符串列表 |
其中argv第一个字符串的意义代表了本程序的运行目录
我们利用了 dirent.h
中提供的DIR
和dirent
两个结构体
DIR | dirent |
---|---|
打开的目录结构体 | DIR 下文件/目录的信息 |
同时利用readdir
来读取目录下的信息, readdir
读取 DIR
每次读取返回一个dirent
,
通过dirent
结构体来获取该文件/目录的详细信息.
简单的看一下 readdir
如何使用
The readdir() function returns a pointer to the next directory entry. It returns NULL upon reaching the end of the directory or on error. In the event of an error, errno may be set to any of the values documented for the getdirentries(2) system call.
实现效果
#在终端中执行命令
./customls .
Golang 的 ls 实现
Golang 实现起来,可以说很简单了,利用
iotuil
和os
包,就能轻松实现一个简单的ls
功能
package main
import (
"io/ioutil"
"os"
"fmt"
)
func main() {
if len(os.Args) != 2 {
fmt.Println("错误,参数不足")
return
}
targetDirPath := os.Args[1]
if dirList, err := ioutil.ReadDir(targetDirPath); err == nil {
for _, dirInfo := range dirList {
fmt.Println(dirInfo.Name())
}
} else {
fmt.Println(err.Error())
}
}
关键点
- 使用
os.Agrs
来获取传入程序的参数 - 使用
ioutil.ReadDir
读取目录,将返回值[] FileInfo
遍历,输出目录/文件信息 - 将遇到的
error
输出到 终端