【问题标题】:Unable to read file using java and smbj on shared drive无法在共享驱动器上使用 java 和 smbj 读取文件
【发布时间】:2017-12-04 12:12:59
【问题描述】:

我正在尝试使用 SMBJ jar (https://github.com/hierynomus/smbj) 从共享驱动器中获取文件。我能够连接到共享磁盘。连接后,我执行的任何操作都会抛出异常。

对于我的共享驱动器位置://x.x.x.x/ contains/folder/filename.txt,我使用的参数为:

//SERVER_ADDRESS = x.x.x.x
//SHARE_NAME = /containing/folder/
//FILE_NAME = filename.txt
//LOCAL_PATH = "D:\\";

    SMBClient client = new SMBClient();
    try (Connection connection = client.connect(SERVER_ADDRESS)) {
        AuthenticationContext ac = new AuthenticationContext(USERNAME, PASSWORD.toCharArray(), DOMAIN);
        Session session = connection.authenticate(ac);
        // Connect to Share
        try (DiskShare share = (DiskShare) session.connectShare(SHARE_NAME)) {
            Set<SMB2ShareAccess> s = new HashSet<>();
            s.add(SMB2ShareAccess.ALL.iterator().next()); // this is to get READ only
            com.hierynomus.smbj.share.File remoteSmbjFile =  share.openFile(SHARE_NAME+FILE_NAME, EnumSet.of(AccessMask.GENERIC_READ), null, s, null, null);
            java.io.File dest = new java.io.File(LOCAL_PATH + FILE_NAME);
            try (InputStream is = remoteSmbjFile.getInputStream();
                    OutputStream os = new FileOutputStream(dest);) {
                byte[] buffer = new byte[1024];
                int length;
                while ((length = is.read(buffer)) > 0) {
                    os.write(buffer, 0, length);
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
        LOGGER.error("", e);
        return "ERROR";
    } catch (Exception e) {
        e.printStackTrace();
        LOGGER.error("", e);
        return "ERROR";
    }

我得到如下异常。我认为我没有得到正确的参数组合。

com.hierynomus.mssmb2.SMBApiException: STATUS_INVALID_PARAMETER(3221225485/3221225485): Create failed for \containing\folder\
    at com.hierynomus.smbj.share.Share.receive(Share.java:364)
    at com.hierynomus.smbj.share.Share.sendReceive(Share.java:344)
    at com.hierynomus.smbj.share.Share.createFile(Share.java:136)
    at com.hierynomus.smbj.share.DiskShare.open(DiskShare.java:59)
    at com.hierynomus.smbj.share.DiskShare.openDirectory(DiskShare.java:82)
    at com.hierynomus.smbj.share.DiskShare.list(DiskShare.java:169)
    at com.hierynomus.smbj.share.DiskShare.list(DiskShare.java:151)

我无法理解这里有什么问题。你能建议我在这里缺少什么吗?

【问题讨论】:

  • 嗨@alpha,你解决了这个问题吗?如果可能,请分享信息。

标签: java smb


【解决方案1】:

共享名称不应包含\。在您的示例中,它应该设置为containing。要打开的文件名应为folder\filename.txt。 还要记住,SMB 路径使用\ 而不是/

【讨论】:

  • “共享名”到底是什么?另外,添加文件路径时,前面是否需要“smb:\\”?任何帮助将不胜感激!
  • 共享名称是 SMB 共享的名称。它不是 URL,所以没有 SMB://
  • 感谢您提供的信息。我还不能测试它,因为我在SMBClient client = new SMBClient() 上收到NoClassDefFound 错误。如果您有时间并对此感到满意,您能否看看我试图将您的 SMBJ 库添加到我现有的项目 here? 时遇到的问题。我对 Android Studio 的熟练程度不如 Visual Studio。
【解决方案2】:

如果您的共享文件夹是\\x.x.x.x\containing\folder\,那么shareName 是containing

【讨论】:

    【解决方案3】:

    如果您的代码中没有必要使用https://github.com/AgNO3/jcifs-ng 库,请尝试使用该库。

    与 SmbFile 类的共享文件夹的有效连接: SmbException failed to connect hostname/IP_address throwing with proper credentials in Java

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-04
      • 2020-07-22
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      相关资源
      最近更新 更多