异步获取“慢速协议”的目录条目

我想要一个在 Linux 上获取目录条目的函数。我用过ioutil.ReadDir,通常速度很快。但是如果我想读取一些已安装的虚拟文件系统/run/user/1000/gvfs/,这个功能就会变得很慢。如果目录中有很多文件条目,我需要等待很长时间。

我可以ls在终端中使用该命令,结果将是相同的。当我尝试时,ls -U -a -p -1我立即得到了逐行输出。我尝试在 Go 中运行它exec.Command,但它不能异步工作。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 中逐行打印。


三国纷争
浏览 74回答 1
1回答

FFIVE

尝试ls -U -a -p 1 | cat查看是否获得逐行输出。Go 无法控制ls;如果选择这样做,ls则进行逐行写入,如果其输出是管道,则选择不这样做。您可以分配一个 pty 对并使用它,但这是错误的方法。lslsioutil.ReadDir首先读取整个目录(通过调用Readdir(-1)),然后对文件名进行排序。如果您使用os.Open打开目录,然后使用一个小(但不是负)数字调用Readdiror函数,您应该会得到更符合您喜好的东西。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go