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