为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
三国纷争 2023-07-10 10:55:22
我想要一个在 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 中逐行打印。
查看完整描述

1 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

尝试ls -U -a -p 1 | cat查看是否获得逐行输出。

Go 无法控制ls;如果选择这样做,ls则进行逐行写入,如果其输出是管道,则选择不这样做。您可以分配一个 pty 对并使用它,但这是错误的方法。lsls

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


查看完整回答
反对 回复 2023-07-10
  • 1 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信