08.16 遍历目录树

本节将介绍Go编写的find(1)命令行程序的一个相对简单的版本。

程序名为gofind.go,分为四部分介绍。gofind.go的代码将支持两个命令行选项。-d选项在作为目录的路径前面打印一个星形字符,而-f选项在作为常规文件的路径前面打印一个加号字符。

goFind.go第一部分代码如下:

package main

import (
    "flag"
    "fmt"
    "os"
    "path/filepath"
)

如你所见,goFind.go程序使用flag包高效地处理命令行参数。

goFind.go第二部分代码如下:

var minusD bool = false
var minusF bool = false

func walk(path string, info os.FileInfo, err error) error {
    fileInfo, err := os.Stat(path)
    if err != nil {
        return err
    }
    mode := fileInfo.Mode()
    if mode.IsRegular() && minusF {
        fmt.Println("+", path)
        return nil
    }
    if mode.IsDir() && minusD {
        fmt.Println("*", path)
        return nil
    }
    fmt.Println(path)
    return nil
}

由于minusDminusF应该可以从程序中的任何地方访问,包括walk()函数,我决定将它们设置为全局变量。IsDir()函数用于识别目录,isRegular()用于识别常规文件。

goFind.go第三部分代码如下:

goFind.go最后一部分代码如下:

执行goFind.go将创建如下的输出:

goFind.go的输出包含了指定根目录下的所有文件类型,包括套接字和符号链接。如果对walk()函数进行必要的更改,你可以告诉gofind.go只打印你真正感兴趣的信息。这是留给你做的练习。

现在想象一下使用C编程语言的标准库函数来实现相同的程序有多困难!

Last updated

Was this helpful?