You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 22:05:17