如何使用filepath.Walk()仅查找文本文件?
我正在使用如何使用filepath.Walk()仅查找文本文件?,file,go,File,Go,我正在使用filepath.Walk()搜索目录中的所有文件。我正在实现一个搜索工具,所以我只对打开包含文本的文件感兴趣。我想知道是否有办法忽略我不想搜索的二进制文件之类的东西。我正在尝试最小化操作系统调用,因此如果只使用os.FileInfo就可以做到这一点,那么知道文件(或任何字节流)是否只包含“文本”的唯一方法就是读取流的全部内容,并根据您的定义确定每个符文是否都是“文本”字符 例如,如果所有符符在(0128)< /代码>中都有整数值,则可以考虑一个文件“ASCII文本”,它不是控制字符,
filepath.Walk()
搜索目录中的所有文件。我正在实现一个搜索工具,所以我只对打开包含文本的文件感兴趣。我想知道是否有办法忽略我不想搜索的二进制文件之类的东西。我正在尝试最小化操作系统调用,因此如果只使用os.FileInfo
就可以做到这一点,那么知道文件(或任何字节流)是否只包含“文本”的唯一方法就是读取流的全部内容,并根据您的定义确定每个符文是否都是“文本”字符
例如,如果所有符符在<代码>(0128)< /代码>中都有整数值,则可以考虑一个文件“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))
}
func isASCIITextStream(rd io.Reader)(布尔,错误){
读卡器:=bufio.NewReader(rd)
为了{
r、 _u,err:=reader.ReadRune()
如果err==io.EOF{
返回true,nil//每个符文都是文本。
}
如果错误!=零{
返回false,err//意外错误。
}
if!isASCIIText(r){
return false,nil//至少有一个符文不是文本。
}
}
返回true,fmt.Errorf(“未找到EOF”)//意外状态。
}
func isASCIIText(r符文)bool{
x:=int64(r)
return(x>=0)&(x我认为os.FileInfo
或通过检查文件扩展名是不够的。除非扫描文件内容以查看文件是否包含非文本字符(ASCII或UNICODE)我认为问题不在于如何通过文件名来识别文本文件,而在于如何通过查看内容来识别文本文件。如果是这样,你唯一能做的就是检查文件的内容。如果是通过“文本文件”你的意思是UTF-8,你可以使用utf8
包中的函数来确定文件是否包含有效的UTF-8。编写一个函数,根据你认为合适的“文本文件”定义检查每个文件。如果你有问题,请向我们展示你的代码,并解释你的具体问题。是的,你称之为“文本文件?”这似乎是人类知道自己的文件,但不必告诉他们的机器。我意识到这是非常主观的。我认为最快的方法(虽然不是绝对正确的)是检查文件的一部分是否有有效的utf8字符