异步获取 "slow protocols" 的目录条目

Get directory entries for "slow protocols" asynchronously

我想要一个函数来获取 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看看你是否得到逐行输出。

围棋不掌控ls;如果ls选择这样做,ls就逐行写,而ls选择 当它的输出是一个管道时这样做。您可以分配一个 pty 对并使用它,但这样做是错误的方法。

ioutil.ReadDir 首先读取整个目录(通过调用 Readdir(-1)),然后对文件名进行排序。如果你使用 os.Open 打开目录,然后用一个小的(但不是负数)调用 Readdir or Readdirnames 函数,你应该得到更多你喜欢的东西。