Golang bug ioutil.ReadDir()列出CIFS共享文件?或者,做错了什么?

use*_*181 5 go readdir

尝试从安装到CIFS文件系统的目录中获取文件名列表.如果序列中有一定数量的文件(> 55),即00000.xxx到00299.xxx,则列表中缺少某些文件(例如文件00055.xxx可能不存在).无关文件的大小.它们可以是零大小.使用本地文件系统中的相同代码可以正常工作.丢失的文件似乎与目录中的文件数量一致(例如,目录中的56个文件可能总是丢失文件21,而300个文件可能会丢失55,81,137).以下程序中不返回任何错误.

这是在CentOS 7.4上运行的.

将golang程序减少为两种不同的方法(均失败):

方法1:

package main
import "os"
import "fmt"
import "io/ioutil"

func main() {
    directory := os.Args[1]

    files, readDirError := ioutil.ReadDir(directory)

    if readDirError != nil {
        fmt.Printf("Error in readDir\n")
        fmt.Println(readDirError)
        fmt.Println("\n")
    }

    for x, f := range files {
        fmt.Printf("%d => %s\n", x, f.Name())
    }
}
Run Code Online (Sandbox Code Playgroud)

方法#2

package main
import "os"
import "fmt"

func main() {
    dir, readDirError := os.Open(os.Args[1])

    defer dir.Close()

    if readDirError != nil {
        fmt.Printf("Error in readDir\n")
        fmt.Println(readDirError)
        fmt.Println("\n")
    }

    fi, err := dir.Stat()

    if err != nil {
        fmt.Println(err)
        return
    }

    if fi.IsDir() {
        fis, err := dir.Readdir(-1)

        if err != nil {
            fmt.Println(err)
            return
        }

        for _, fileinfo := range fis {
            fmt.Printf("%s\n", fileinfo.Name())
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

创建了一个执行相同操作的C程序,每次都可以工作,即它列出了目录中的所有文件.因此,从文件系统获取所有信息似乎不是问题.

#include <dirent.h>
#include <stdio.h>

int main(int c, char **argv)
{
  DIR           *d;
  struct dirent *dir;
  d = opendir(argv[1]);
  if (d)
  {
    while ((dir = readdir(d)) != NULL)
    {
      printf("%s\n", dir->d_name);
    }

    closedir(d);
  }

  return(0);
}
Run Code Online (Sandbox Code Playgroud)

关于问题可能是什么的任何线索?我想,在这一点上,我们可能需要包装一个C函数来获得正确的列表.

顺便说一句,目录中的文件都具有相同的权限,没有一个是符号链接或硬链接,从终端窗口上的ls -l命令看,所有内容都是正常的.