替换jcifs为smbj库后无法列出并拷贝本地文件到远程SMB服务器
错误原因
你遇到的STATUS_BAD_NETWORK_NAME (0xc00000cc)报错,是因为传入的SMB共享名参数不符合smbj的规则,smbj和jcifs的路径适配逻辑不同,不能直接沿用jcifs的写法。
具体修改点
- 修正共享名配置:
session.connectShare()方法需要传入远程服务器开放的SMB共享名称,不能填/,也不需要添加斜杠、IP前缀。比如你远程服务器对外共享的目录名称是my_share,就直接传入"my_share"即可。 - 修正列取路径格式:你要列取的路径是相对于共享根目录的相对路径,不需要使用双斜杠,直接用单正斜杠分割目录即可。
- 变量名说明:你代码里的
Local_SHARE_NAME命名有误,这个参数是远程服务器的共享名,不是本地路径相关参数。
修正后参考代码
import com.hierynomus.msfscc.fileinformation.FileIdBothDirectoryInformation; import com.hierynomus.smbj.SMBClient; import com.hierynomus.smbj.SmbConfig; import com.hierynomus.smbj.auth.AuthenticationContext; import com.hierynomus.smbj.connection.Connection; import com.hierynomus.smbj.session.Session; import com.hierynomus.smbj.share.DiskShare; public class test1 { public static void main(String[] args) throws Exception { SmbConfig cfg = SmbConfig.builder() .withMultiProtocolNegotiate(true) .withSigningRequired(false) .withDfsEnabled(false) .build(); // 替换为远程服务器实际的SMB共享名 final String REMOTE_SHARE_NAME = "my_share"; // 替换为共享目录下要列取的相对路径,列取共享根目录就填空字符串 final String TARGET_PATH = "home/username/myfolder"; SMBClient client = new SMBClient(cfg); try (Connection connection = client.connect("Remote_Server_IP")) { AuthenticationContext ac = new AuthenticationContext("user", "pwd".toCharArray(), "Domainname"); Session session = connection.authenticate(ac); try (DiskShare share = (DiskShare) session.connectShare(REMOTE_SHARE_NAME)) { for (FileIdBothDirectoryInformation f : share.list(TARGET_PATH)) { System.out.println("File : " + f.getFileName()); } } } catch (Exception e) { e.printStackTrace(); } finally { client.close(); } } }
前置验证项
运行代码前先确认以下条件,避免其他报错:
- 远程SMB共享可正常访问:Windows端可在资源管理器输入
\\远程IP\共享名,输入账号密码验证连通性;Linux端可通过smbclient //远程IP/共享名 -U 用户名命令验证。 - 你使用的账号对目标共享目录、要列取的子目录有可读权限。
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

