我正在尝试创建一个可以将文件从Unix Samba共享复制到Windows文件夹的Java应用程序。为了实现这一点,我使用了JCIFS库。
我有以下代码:
SmbFile smbFromFile = new SmbFile("smb:////192.168.10.1//data", auth);
smbFromFile.copyTo(destinationFolder);
我将其修改为:
SmbFile smbFromFile = new SmbFile("smb:////192.168.10.1//data", auth);
SmbFile destinationFolder = new SmbFile("C:\\Temp\\IN\\");
smbFromFile.copyTo(destinationFolder);
但它给了我以下错误:
Exception in thread "main" jcifs.smb.SmbAuthException: Logon failure: unknown user name or bad password.
at jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:546)
at jcifs.smb.SmbTransport.send(SmbTransport.java:663)
at jcifs.smb.SmbSession.sessionSetup(SmbSession.java:390)
at jcifs.smb.SmbSession.send(SmbSession.java:218)
at jcifs.smb.SmbTree.treeConnect(SmbTree.java:176)
at jcifs.smb.SmbFile.doConnect(SmbFile.java:911)
at jcifs.smb.SmbFile.connect(SmbFile.java:957)
at jcifs.smb.SmbFile.connect0(SmbFile.java:880)
at jcifs.smb.SmbFile.copyTo(SmbFile.java:2303)
at RU.Tasks.Task3_Load_MedioSCP_Tekelek_file_To_DB_Oracle_BMCDB.main(Task3.java:203)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
如果我尝试在Samba共享上创建一个新文件,它会按预期工作:
String user = "usersamba";
String pass ="1234";
String hostname = "192.168.10.1";
String sharedFolder = "data/new";
String path = "smb://"+hostname+"/"+sharedFolder+"/test.txt";
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("",user, pass);
SmbFile smbFile = new SmbFile(path,auth);
SmbFileOutputStream smbfos = new SmbFileOutputStream(smbFile);
smbfos.write("testing....and writing to a file".getBytes());
System.out.println("completed ...nice !");
请帮助解决此问题。
答案 0 :(得分:1)
选项解决问题
InputStream in = null; OutputStream out = null; try{ String SambaURL= "smb://usersamba:1234@192.168.1.110/data/1b.csv"; File destinationFolder = new File("C:\\Temp\\IN\\"); SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmssSSS_"); File child = new File (destinationFolder+ "/" + fmt.format(new Date()) +"1b.csv"); SmbFile dir = new SmbFile(SambaURL); SmbFile fileToGet=new SmbFile(SambaURL); fileToGet.connect(); in = new BufferedInputStream(new SmbFileInputStream(fileToGet)); out = new BufferedOutputStream(new FileOutputStream(child)); byte[] buffer = new byte[4096]; int len = 0; //Read length while ((len = in.read(buffer, 0, buffer.length)) != -1) { out.write(buffer, 0, len); } out.flush(); //The refresh buffer output stream } catch (Exception e) { String msg = "The error occurred: " + e.getLocalizedMessage(); System.out.println(msg); } finally { try { if(out != null) { out.close(); } if(in != null) { in.close(); } } catch (Exception e) {} }
答案 1 :(得分:0)
您需要适当的身份验证机制。例如见:
private static void GetFiles() throws IOException {
jcifs.Config.registerSmbURLHandler();
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(
prop.getProperty("smbDomain"), prop.getProperty("smbUser"),
prop.getProperty("smbPass"));
StaticUserAuthenticator authS = new StaticUserAuthenticator(
prop.getProperty("smbDomain"), prop.getProperty("smbUser"),
prop.getProperty("smbPass"));
FileSystemOptions opts = new FileSystemOptions();
DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts,
authS);
SmbFile smbFile = new SmbFile(prop.getProperty("smbURL"),auth);
FileSystemManager fs = VFS.getManager();
String[] files = smbFile.list();
for(String file:files) {
SmbFile remFile = new SmbFile(prop.getProperty("smbURL") + file, auth);
SmbFileInputStream smbfos = new SmbFileInputStream(remFile);
OutputStream out = new FileOutputStream(file);
byte[] b = new byte[8192];
int n;
while ((n = smbfos.read(b)) > 0) {
out.write(b, 0, n);
}
smbfos.close();
out.close();
}
}