我正在使用filepath.Walk()
搜索目录中的所有文件。我正在实现一个搜索工具,所以我只对打开带有文本的文件感兴趣。我想知道是否有办法忽略我不想搜索的二进制文件之类的东西。我正在尝试最小化操作系统调用,所以如果只使用os.FileInfo
就可以实现这一点。
知道文件(或任何字节流)是否仅包含“文本”的唯一方法是读取流的全部内容,并根据您的定义确定每个符文是否为“文本”字符。
例如,如果所有符文在[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
包都可能有助于对符文进行分类。