.NET Core中使用SMBLibrary获取子文件夹内容的问题
解决SMBLibrary获取共享子文件夹列表返回0条结果的问题
以下是代码存在的关键问题及修正方案:
- 路径冗余错误:TreeConnect已连接到
ShareName共享,后续CreateFile的路径需使用共享根目录下的相对路径,无需重复添加ShareName/,否则会导致目标目录无法被识别。 - 未校验目录查询状态:需检查
QueryDirectory的执行状态,避免因操作失败导致空列表。 - 路径分隔符统一:建议使用Windows风格反斜杠
\,避免跨平台路径解析异常。
修正后的完整代码:
SMB2Client client = new SMB2Client(); bool isConnected = client.Connect("myServername", SMBTransportType.DirectTCPTransport); if (isConnected) { NTStatus status = client.Login(String.Empty, "user", "password"); if (status == NTStatus.STATUS_SUCCESS) { List<string> shares = client.ListShares(out status); ISMBFileStore fileStore = client.TreeConnect("ShareName", out status); object directoryHandle; FileStatus fileStatus; // 直接使用共享根下的子文件夹路径 string folder = @"SUBFOLDER"; status = fileStore.CreateFile(out directoryHandle, out fileStatus, folder, AccessMask.GENERIC_READ, FileAttributes.Directory, ShareAccess.Read | ShareAccess.Write, CreateDisposition.FILE_OPEN, CreateOptions.FILE_DIRECTORY_FILE, null); if(status == NTStatus.STATUS_SUCCESS) { List<QueryDirectoryFileInformation> fileList; // 执行目录查询并校验状态 status = fileStore.QueryDirectory(out fileList, directoryHandle, @"*", FileInformationClass.FileDirectoryInformation); if(status == NTStatus.STATUS_SUCCESS && fileList != null) { // 过滤出仅文件夹类型的条目 var targetFolders = fileList.Where(item => (item.FileAttributes & FileAttributes.Directory) != 0) .Select(item => item.FileName) .ToList(); // 此处可处理获取到的文件夹列表 } status = fileStore.CloseFile(directoryHandle); } status = fileStore.Disconnect(); client.Logoff(); } client.Disconnect(); }
额外提示:
- 调用
QueryDirectory后,务必确认返回状态为STATUS_SUCCESS且fileList不为空,再进行后续处理。 - 若只需获取文件夹,可通过
FileAttributes.Directory过滤结果,排除普通文件条目。
内容的提问来源于stack exchange,提问作者AaronH2001
相关产品推荐
相关产品推荐

