如何使用JCIFS与Apache VFS访问的SMB网址是什么?(How do I use JCIF

2019-06-26 11:12发布

我试图访问使用SMB URL我的本地计算机上的文件夹。 我的项目使用的罐子:公地vfs2-2.0.jar和JCIFS-1.3.17.jar(和所有其他所需的罐子)。 在它的全部的代码是:

public static void main(String[] args) throws FileSystemException {
    jcifs.Config.registerSmbURLHandler();
    StaticUserAuthenticator auth = new StaticUserAuthenticator(<domain>,<user>,<password>);
    FileSystemOptions opts = new FileSystemOptions(); 
    DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);
    FileSystemManager fs = VFS.getManager();
    FileObject smbFile = fs.resolveFile("smb://10.0.2.2/TimeOut/");
    System.out.println(smbFile.exists() + " " + smbFile.getContent().getLastModifiedTime());
}

我收到了异常:

异常在线程“主要” org.apache.commons.vfs2.FileSystemException:无法确定文件的类型“SMB://10.0.2.2/TimeOut”。 在在com.newsway.tests.VfsTest org.apache.commons.vfs2.provider.AbstractFileObject.getType(AbstractFileObject.java:505)在org.apache.commons.vfs2.provider.AbstractFileObject.exists(AbstractFileObject.java:477) 。主要(VfsTest.java:23)产生的原因:jcifs.smb.SmbAuthException:登录失败:禁用当前的帐户。 在jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:546)在jcifs.smb.SmbTransport.send(SmbTransport.java:663)在jcifs.smb.SmbSession.sessionSetup(SmbSession.java:390)在jcifs.smb。 SmbSession.send(SmbSession.java:218)在jcifs.smb.SmbTree.treeConnect(SmbTree.java:176)在jcifs.smb.SmbFile.doConnect(SmbFile.java:911)在jcifs.smb.SmbFile.connect(SmbFile的.java:954)在jcifs.smb.SmbFile.connect0(SmbFile.java:880)在jcifs.smb.SmbFile.open0(SmbFile.java:972)在jcifs.smb.SmbFile.open(SmbFile.java:1006)在jcifs.smb.SmbFileInputStream。(SmbFileInputStream.java:73)在jcifs.smb.SmbFileInputStream。(SmbFileInputStream.java:65)在jcifs.smb.SmbFile.getInputStream(SmbFile.java:2844)在org.apache.commons。 vfs2.provider.url.UrlFileObject.doGetType(UrlFileObject.java:89)在org.apache.commons.vfs2.provider.AbstractFileObject.getType(AbstractFileObject.java:496)

从中我了解到,相关部分是: 登录失败:禁用当前的帐户。

尽管这是一个事实,我的用户名/密码/域都很好,我做的究竟是什么在VFS文档页面定义。

我在想什么?

Answer 1:

我想我知道你的问题是什么,沙箱供应商没有在2.0自动注册。 而且还需要在解析调用(见下文修改的源)实际使用配置的认证属性。

我通常不使用默认的文件系统管理器,但动态地登记自己的供应商,但如果你想使用的自动检测,你需要VFS-providers.xml添加到沙箱JAR。

这是你如何建立一个完整的工作JAR 2.0:

> git clone https://github.com/apache/commons-vfs.git -b commons-vfs2-project-2.0 vfs2.0
> cd vfs2.0
> notepad sandbox\pom.xml
> notepad sandbox\src\test\java\org\apache\commons\vfs2\provider\smb\test\StandaloneMain.java
> mvn -Pinclude-sandbox -DskipTests=true clean package dependency:tree

当您编辑的沙箱/ pom.xml的,你需要确保从<版本>删除-SANDBOX和<母公司> <版本>标签。 然后,你需要添加:

  <resource>
    <directory>src/main/resources</directory>
  </resource>

到已经存在<资源>标记(后右第一许可证+注意包括线88)

这是用于测试代码:

package org.apache.commons.vfs2.provider.smb.test;

import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemException;
import org.apache.commons.vfs2.FileSystemManager;
import org.apache.commons.vfs2.FileSystemOptions;
import org.apache.commons.vfs2.VFS;
import org.apache.commons.vfs2.auth.StaticUserAuthenticator;
import org.apache.commons.vfs2.impl.DefaultFileSystemConfigBuilder;


public class StandaloneMain
{
    public static void main(String[] args) throws FileSystemException {
        //jcifs.Config.registerSmbURLHandler();
        StaticUserAuthenticator auth = 
              new StaticUserAuthenticator("DOMAIN", "user", "SECRET");
        FileSystemOptions opts = new FileSystemOptions();
        DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);
        FileSystemManager fs = VFS.getManager();
        if (!fs.hasProvider("smb")) throw new RuntimeException("Provider missing");
        System.out.println("Connecting " + args[0] + " with " + opts);
        FileObject smbFile = fs.resolveFile(args[0], opts); // added opts!
        System.out.println(smbFile.exists() + " " + smbFile.getContent().getLastModifiedTime());
    }
}

这是执行:

> set REP=C:\Users\USERNAME\.m2\repository
> java -cp sandbox\target\commons-vfs2-sandbox-2.0.jar;^
           core\target\commons-vfs2-2.0.jar;^
           %REP%\commons-logging\commons-logging\1.1.1\commons-logging-1.1.1.jar;^
           %REP%\jcifs\jcifs\0.8.3\jcifs-0.8.3.jar;^
           sandbox\target\test-classes
       org.apache.commons.vfs2.provider.smb.test.StandaloneMain smb://HOST/Users
Jan 05, 2015 2:40:19 PM org.apache.commons.vfs2.VfsLog info
INFORMATION: Using "C:\Users\USERNAME\AppData\Local\Temp\vfs_cache" as temporary files store.
Connecting smb://eckenfels02/Users with org.apache.commons.vfs2.FileSystemOptions@27dd2ec5
true 0


Answer 2:

我用不同的身份验证方法和它的作品,你可以给它一个镜头。

String url = "smb://10.0.2.2/TimeOut/";   
NtlmPasswordAuthentication authen = new NtlmPasswordAuthentication(<domain>,<username>,<password>); 
SmbFile smbFile = new SmbFile(url,authen);


文章来源: How do I use JCIFS with apache VFS to access an SMB URL?