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
}由于minusD和minusF应该可以从程序中的任何地方访问,包括walk()函数,我决定将它们设置为全局变量。IsDir()函数用于识别目录,isRegular()用于识别常规文件。
goFind.go第三部分代码如下:
goFind.go最后一部分代码如下:
执行goFind.go将创建如下的输出:
goFind.go的输出包含了指定根目录下的所有文件类型,包括套接字和符号链接。如果对walk()函数进行必要的更改,你可以告诉gofind.go只打印你真正感兴趣的信息。这是留给你做的练习。
现在想象一下使用
C编程语言的标准库函数来实现相同的程序有多困难!
Last updated
Was this helpful?