如何使用filepath.Walk()找到只有文本文件?

时间:2017-12-29 01:05:46

标签: file go

我正在使用filepath.Walk()来搜索目录中的所有文件。我正在实现一个搜索工具,所以我只对打开带有文本的文件感兴趣。我想知道是否有办法忽略我不想搜索的二进制文件之类的东西。我正在尝试最小化操作系统调用,所以如果只使用os.FileInfo就可以完成。

1 个答案:

答案 0 :(得分:1)

知道文件(或任何字节流)是否仅包含" text"的唯一方法是读取流的全部内容,并确定每个符文是否是"文本"字符根据你的定义。

例如,可以考虑一个文件" ASCII文本"如果所有符文在[0,128]中都有整数值,则不是控制字符,或者是空格:

func isASCIITextStream(rd io.Reader) (bool, error) {
    reader := bufio.NewReader(rd)
    for {
        r, _, err := reader.ReadRune()
        if err == io.EOF {
            return true, nil // Every rune was text.
        }
        if err != nil {
            return false, err // Unexpected error.
        }
        if !isASCIIText(r) {
            return false, nil // At least one rune was not text.
        }
    }
    return true, fmt.Errorf("did not find EOF") // Unexpected state.
}

func isASCIIText(r rune) bool {
    x := int64(r)
    return (x >= 0) && (x <= 128) && (!unicode.IsControl(r) || unicode.IsSpace(r))
}

当然,大多数人会认为许多其他Unicode字符类都包含&#34; text&#34;,所以无论你的方法是什么,unicode包都可能有助于对符文进行分类。