我想要一个在 Linux 上获取目录条目的函数。我用 ioutil.ReadDir
通常它很快。
但是如果我想在/run/user/1000/gvfs/
上读取一些挂载的虚拟文件系统,这个函数就变慢了。如果目录有很多文件条目,我需要等待很长时间。
我可以在终端中使用 ls
命令,结果是一样的。
当我尝试 ls -U -a -p -1
时,我立即得到了逐行输出。
我尝试使用 exec.Command
在 Go 中运行它,但它无法异步运行。 Go 正在等待完整的程序输出。我做错了什么?
m.cmd = exec.Command("ls", "-U", "-a", "-p", "-1")
// for example some "slow" directory:
m.cmd.Dir = "/run/user/1000/gvfs/dav:host=webdav.yandex.ru,ssl=true,user=...../"
reader, _ := m.cmd.StdoutPipe()
bufReader := bufio.NewReader(reader)
go func() {
m.cmd.Start()
for {
line, _, err := bufReader.ReadLine()
if err != nil {
break
}
linestr := string(line)
if linestr != "./" && linestr != "../" {
fmt.Println(linestr)
}
}
}()
我需要在 Go 中立即逐行打印。
最佳答案
试试 ls -U -a -p 1 | cat
查看是否得到逐行输出。
Go 不控制 ls
;如果 ls
选择这样做,ls
会逐行写入,而 ls
选择不 当它的输出是一个管道时这样做。您可以分配一个 pty 对并使用它,但这是错误的方法。
ioutil.ReadDir
首先读取整个目录(通过调用 Readdir(-1)
),然后对文件名进行排序。如果您使用 os.Open
打开目录,则调用 Readdir
或 Readdirnames
用一个小的(但不是负数)函数,你应该得到更多你喜欢的东西。
关于linux - 异步获取 "slow protocols"的目录条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57262062/