尝试从安装到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())
    }
}

方法#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())
        }
    }
}

创建了一个执行相同操作的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);
}

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

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