前言
ls
命令使我們每天頻繁的使用,ls
可以輕松的列出這個(gè)一個(gè)目錄下所有的文件
和目錄
.
我們現(xiàn)在就來(lái)實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的目錄命令ls
.
代碼 Git 地址 SuzhenProjects/ApueProject
ls 命令初探
我在
Home
目錄下執(zhí)行了 ls
指令,可以清晰的看到,所有的文件,和目錄,都被列了出來(lái).
ls 命令淺析
-
ls
命令支持輸入一個(gè)目錄地址 - 讀取該名錄的信息,循環(huán)列出所有
檔案
的信息
說(shuō)干就干
//
// 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++ 來(lái)編寫第一段程序,很多人知道意義,我們也不妨重新溫習(xí)
注意main
函數(shù)的聲明
argc | argv |
---|---|
參數(shù)個(gè)數(shù) | 參數(shù)字符串列表 |
其中argv第一個(gè)字符串的意義代表了本程序的運(yùn)行目錄
我們利用了 dirent.h
中提供的DIR
和dirent
兩個(gè)結(jié)構(gòu)體
DIR | dirent |
---|---|
打開(kāi)的目錄結(jié)構(gòu)體 | DIR 下文件/目錄的信息 |
同時(shí)利用readdir
來(lái)讀取目錄下的信息, readdir
讀取 DIR
每次讀取返回一個(gè)dirent
,
通過(guò)dirent
結(jié)構(gòu)體來(lái)獲取該文件/目錄的詳細(xì)信息.
簡(jiǎn)單的看一下 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.
實(shí)現(xiàn)效果
#在終端中執(zhí)行命令
./customls .
Golang 的 ls 實(shí)現(xiàn)
Golang 實(shí)現(xiàn)起來(lái),可以說(shuō)很簡(jiǎn)單了,利用
iotuil
和os
包,就能輕松實(shí)現(xiàn)一個(gè)簡(jiǎn)單的ls
功能
package main
import (
"io/ioutil"
"os"
"fmt"
)
func main() {
if len(os.Args) != 2 {
fmt.Println("錯(cuò)誤,參數(shù)不足")
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())
}
}
關(guān)鍵點(diǎn)
- 使用
os.Agrs
來(lái)獲取傳入程序的參數(shù) - 使用
ioutil.ReadDir
讀取目錄,將返回值[] FileInfo
遍歷,輸出目錄/文件信息 - 將遇到的
error
輸出到 終端