尝试从安装到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命令看,所有内容都是正常的 .