异步获取 "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
函数,你应该得到更多你喜欢的东西。
我想要一个函数来获取 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
函数,你应该得到更多你喜欢的东西。