前言
ls 命令使我们每天频繁的使用,ls 可以轻松的列出这个一个目录下所有的文件和目录.
我们现在就来实现一个最简单的目录命令ls.
代码 Git 地址 SuzhenProjects/ApueProject
ls 命令初探
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 .
cpp-ls 效果.png
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输出到 终端










网友评论