Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用filepath.Walk()仅查找文本文件?_File_Go - Fatal编程技术网

如何使用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字符