[APUE] ls 命令简单实现(C++/Golang)

前言

ls 命令使我们每天频繁的使用,ls 可以轻松的列出这个一个目录下所有的文件目录.
我们现在就来实现一个最简单的目录命令ls.

代码 Git 地址 SuzhenProjects/ApueProject

ls 命令初探

ls 命令效果

我在 Home目录下执行了 ls 指令,可以清晰的看到,所有的文件,和目录,都被列了出来.

ls 命令浅析

  1. ls命令支持输入一个目录地址
  2. 读取该名录的信息,循环列出所有档案的信息

说干就干

//
// Created by suzhen on 03/01/2018.
//
#include 
#include 
#include 
#include 

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 中提供的DIRdirent两个结构体

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 .
[APUE] ls 命令简单实现(C++/Golang)_第1张图片
cpp-ls 效果.png

Golang 的 ls 实现

Golang 实现起来,可以说很简单了,利用 iotuilos 包,就能轻松实现一个简单的 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())
    }

}

关键点

  1. 使用 os.Agrs 来获取传入程序的参数
  2. 使用 ioutil.ReadDir 读取目录,将返回值[] FileInfo遍历,输出目录/文件信息
  3. 将遇到的error 输出到 终端

你可能感兴趣的:([APUE] ls 命令简单实现(C++/Golang))