2016-07-21 4 views
0

Ich versuche eine Java-Anwendung zu erstellen, die Dateien von einer Unix Samba-Freigabe in einen Windows-Ordner kopieren kann. Um das zu erreichen, benutze ich die JCIFS-Bibliothek.Java JCIFS Wie kann man Dateien von Samba nach Windows lokal kopieren?

Ich habe den folgenden Code:

SmbFile smbFromFile = new SmbFile("smb:////192.168.10.1//data", auth); 
smbFromFile.copyTo(destinationFolder); 

Ich bin Modifizieren Sie es an:

SmbFile smbFromFile = new SmbFile("smb:////192.168.10.1//data", auth); 
SmbFile destinationFolder = new SmbFile("C:\\Temp\\IN\\"); 
smbFromFile.copyTo(destinationFolder); 

Aber es gibt mir die folgende Fehlermeldung:

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) 

Wenn ich versuche, Erstellen Sie eine neue Datei auf der Samba-Freigabe, es funktioniert wie erwartet:

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 !"); 

Bitte helfen Sie, dieses Problem zu lösen.

Antwort

1

Option löst das Problem

 

    InputStream in = null; 
       OutputStream out = null; 
       try{ 

        String SambaURL= "smb://usersamba:[email protected]/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) {} 
       } 

source here

0

Sie benötigen die richtigen Authentifizierungsmechanismen. Siehe zum Beispiel:

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(); 
    } 

} 
Verwandte Themen