gpt4 book ai didi

file - 如何使用 filepath.Walk() 仅查找文本文件?

转载 作者:数据小太阳 更新时间:2023-10-29 03:41:03 27 4
gpt4 key购买 nike

我正在使用 filepath.Walk() 搜索目录中的所有文件。我正在实现一个搜索工具,所以我只对打开其中包含文本的文件感兴趣。我想知道是否有一种方法可以忽略我不想搜索的二进制文件之类的东西。我试图尽量减少 os 调用,所以如果这可以只用 os.FileInfo 来完成,那就太好了。

最佳答案

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

例如,如果所有 rune 都在 [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包可能有助于对 rune 进行分类。

关于file - 如何使用 filepath.Walk() 仅查找文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48016235/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com