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

标签 linux go exec ls gvfs

我想要一个在 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 打开目录,则调用 ReaddirReaddirnames用一个小的(但不是负数)函数,你应该得到更多你喜欢的东西。

关于linux - 异步获取 "slow protocols"的目录条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57262062/

相关文章:

mysql - 如何使用 Go 创建到 Cloud SQL 数据库的 TLS 连接?

php - 壳牌执行 Jar Php

php - UTF-8贯穿始终

linux - 先前输出后控制台输出不正确

执行RFC7523

linux - 脚本命令从 shell 中丢失别名

java - 打开 PDF 只能在 netbeans 中使用

ruby-on-rails - 无法安装 rails

linux - 获取地址信息 "10 . 10 . 10 . 10"

multithreading - sync.WaitGroup 是 "synchronization primitive"吗?