我想要一个用于在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/

10-16 11:20