[APUE] ls 命令簡(jiǎn)單實(shí)現(xiàn)(C++/Golang)

前言

ls 命令使我們每天頻繁的使用,ls 可以輕松的列出這個(gè)一個(gè)目錄下所有的文件目錄.
我們現(xiàn)在就來(lái)實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的目錄命令ls.

代碼 Git 地址 SuzhenProjects/ApueProject

ls 命令初探

ls 命令效果

我在 Home目錄下執(zhí)行了 ls 指令,可以清晰的看到,所有的文件,和目錄,都被列了出來(lái).

ls 命令淺析

  1. ls命令支持輸入一個(gè)目錄地址
  2. 讀取該名錄的信息,循環(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 中提供的DIRdirent兩個(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 .
cpp-ls 效果.png

Golang 的 ls 實(shí)現(xiàn)

Golang 實(shí)現(xiàn)起來(lái),可以說(shuō)很簡(jiǎn)單了,利用 iotuilos 包,就能輕松實(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)

  1. 使用 os.Agrs 來(lái)獲取傳入程序的參數(shù)
  2. 使用 ioutil.ReadDir 讀取目錄,將返回值[] FileInfo遍歷,輸出目錄/文件信息
  3. 將遇到的error 輸出到 終端
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末然评,一起剝皮案震驚了整個(gè)濱河市剂习,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翩伪,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凳忙,死亡現(xiàn)場(chǎng)離奇詭異疫赎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)檬姥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門曾我,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人健民,你說(shuō)我怎么就攤上這事抒巢。” “怎么了秉犹?”我有些...
    開(kāi)封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵蛉谜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我崇堵,道長(zhǎng)悦陋,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任筑辨,我火速辦了婚禮俺驶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘棍辕。我一直安慰自己暮现,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布楚昭。 她就那樣靜靜地躺著栖袋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抚太。 梳的紋絲不亂的頭發(fā)上塘幅,一...
    開(kāi)封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天昔案,我揣著相機(jī)與錄音,去河邊找鬼电媳。 笑死踏揣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的匾乓。 我是一名探鬼主播捞稿,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拼缝!你這毒婦竟也來(lái)了娱局?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咧七,失蹤者是張志新(化名)和其女友劉穎衰齐,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體继阻,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡娇斩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了穴翩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锦积,死狀恐怖芒帕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丰介,我是刑警寧澤背蟆,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站哮幢,受9級(jí)特大地震影響带膀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜橙垢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一垛叨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柜某,春花似錦嗽元、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至翰绊,卻和暖如春佩谷,著一層夾襖步出監(jiān)牢的瞬間旁壮,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工谐檀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抡谐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓稚补,卻偏偏與公主長(zhǎng)得像童叠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子课幕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語(yǔ)言润绎,發(fā)作 oo-boon-too 的音撬碟。了解發(fā)音是有意...
    螢火蟲(chóng)de夢(mèng)閱讀 99,201評(píng)論 9 467
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)莉撇,斷路器呢蛤,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    Joyyx閱讀 8,325評(píng)論 0 16
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無(wú)法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,146評(píng)論 2 34
  • 來(lái)自:凈塵1、看不透看不透人際中的糾結(jié)棍郎、爭(zhēng)斗后的隱傷其障,看不透喧囂中的平淡、繁華后的寧?kù)o涂佃。2励翼、舍不得舍不得曾經(jīng)的精彩...
    上官曙光閱讀 405評(píng)論 0 0