我正在尝试使用smb URL访问本地计算机上的文件夹。我的项目使用的是jar:commons-vfs2-2.0.jar和jcifs-1.3.17.jar(以及所有其他必需的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());
}
我收到异常:
线程"main"中出现异常org.apache.commons.fs2.FileSystemException:无法确定文件类型"smb://10.0.2.2/TimeOut"org.apache.commons.vfs2.provider.AbstractFileObject.getType(AbstractFileObject.java:505)在org.apache.commons.vfs2.provider.AbstractFileObject.exists(AbstractFileObject.java:477)在com.newsway.tests.VfsTest.main(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位于的jcifs.smb.SmbFileInputStream。(SmbFileInput Stream.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文档页面中定义的事情。
我错过了什么?
我想我知道你的问题是什么,沙盒提供者在2.0中没有自动注册。此外,您还需要在解析调用中实际使用配置的身份验证属性(请参阅下面修改的源代码)。
我通常不使用默认的文件系统管理器,而是动态注册我的提供程序,但如果您想使用自动检测,则需要将vfs-providers.xml添加到沙箱JAR中。
这就是如何使用2.0:构建一个完整的工作JAR
> git clone https://github.com/apache/commons-vfs.git -b commons-vfs2-project-2.0 vfs2.0
> cd vfs2.0
> notepad sandboxpom.xml
> notepad sandboxsrctestjavaorgapachecommonsvfs2providersmbtestStandaloneMain.java
> mvn -Pinclude-sandbox -DskipTests=true clean package dependency:tree
编辑sandbox/pom.xml时,需要确保从<版本>和<父级><版本>标签。然后你需要添加:
<resource>
<directory>src/main/resources</directory>
</resource>
到已经存在的<resources>标签(在第一个许可证+通知之后,包括第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:UsersUSERNAME.m2repository
> java -cp sandboxtargetcommons-vfs2-sandbox-2.0.jar;^
coretargetcommons-vfs2-2.0.jar;^
%REP%commons-loggingcommons-logging1.1.1commons-logging-1.1.1.jar;^
%REP%jcifsjcifs .8.3jcifs-0.8.3.jar;^
sandboxtargettest-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:UsersUSERNAMEAppDataLocalTempvfs_cache" as temporary files store.
Connecting smb://eckenfels02/Users with org.apache.commons.vfs2.FileSystemOptions@27dd2ec5
true 0
我使用不同的身份验证方法,它有效,你可以试试。
String url = "smb://10.0.2.2/TimeOut/";
NtlmPasswordAuthentication authen = new NtlmPasswordAuthentication(<domain>,<username>,<password>);
SmbFile smbFile = new SmbFile(url,authen);