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

问题描述 投票:-2回答:1

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

file go
1个回答
1
投票

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

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

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字符类包含“文本”,所以无论你采用什么方法,unicode包都可能有助于对符文进行分类。

© www.soinside.com 2019 - 2024. All rights reserved.