我想要一个用于在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
的输出是管道时,ioutil.ReadDir
选择不这样做。您可以分配一个pty对并使用它,但这是错误的方法。Readdir(-1)
首先读取整个目录(通过调用os.Open
),然后对文件名进行排序。如果使用Readdir
打开目录,然后以较小的数字(但不是负数)调用 Readdirnames
或 ojit_code 函数,则您应该会更喜欢。
关于linux - 异步获取 “slow protocols”的目录条目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57262062/