How to copy file from smb share to local drive using jcifs in Java?

前端 未结 5 1703
后悔当初
后悔当初 2020-12-06 19:07

Could anybody help me to copy file from shared folder to local drive? My code is:

import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbFile;
impo         


        
相关标签:
5条回答
  • 2020-12-06 19:39

    This is for clarification. "Logon failure: unknown user name or bad password." can show for example when you use 1.3.18 but not in 1.2.25. it is probably because different compatibility settings:

    1. jcifs.smb.lmCompatibility = 0 or 1: Send LM and NTLM 2)
    2. jcifs.smb.lmCompatibility = 2: Send NTLM in both fields 3)
    3. jcifs.smb.lmCompatibility = 3, 4, or 5: Send just LMv2

    First way is to use it before NtlmPasswordAuthentication

    jcifs.Config.setProperty( "jcifs.smb.lmCompatibility", "3");

    It can resolve this issue.

    0 讨论(0)
  • 2020-12-06 19:39

    you must use the file: protocol

    SmbFile dest = new SmbFile ("file:" + "C:/SQLRESTORESTAGE/v2.bak");
    
    0 讨论(0)
  • 2020-12-06 19:47

    I got it to work. I had to 'create' the destination file before doing the copy. try adding the middle line below into your original code-snippet and see if that works.

    SmbFile dest = new SmbFile ("C:/SQLRESTORESTAGE/v2.bak");
    dest.createNewFile();
    dir.copyTo(dest);
    
    0 讨论(0)
  • 2020-12-06 19:56

    After many trials and failures the only method that worked for me reliably was to go old school and use FileInputStream and FileOutputStream like so:

       `SmbFile[] files = getSMBListOfFiles(sb, logger, domain, userName, password, sourcePath, sourcePattern);
    
        if (files == null)
            return false;
        output(sb, logger, "      Source file count: " + files.length);
        String destFilename;
        FileOutputStream fileOutputStream;
        InputStream fileInputStream;
        byte[] buf;
        int len;
        for (SmbFile smbFile: files) {
            destFilename = destinationPath + smbFile.getName();
            output(sb, logger, "         copying " + smbFile.getName());
            try {
                fileOutputStream = new FileOutputStream(destFilename);
                fileInputStream = smbFile.getInputStream();
                buf = new byte[16 * 1024 * 1024];
                while ((len = fileInputStream.read(buf)) > 0) {
                    fileOutputStream.write(buf, 0, len);
                }
                fileInputStream.close();
                fileOutputStream.close();
            } catch (SmbException e) {
                OutputHandler.output(sb, logger, "Exception during copyNetworkFilesToLocal stream to output, SMP issue: " + e.getMessage(), e);
                e.printStackTrace();
                return false;
            } catch (FileNotFoundException e) {
                OutputHandler.output(sb, logger, "Exception during copyNetworkFilesToLocal stream to output, file not found: " + e.getMessage(), e);
                e.printStackTrace();
                return false;
            } catch (IOException e) {
                OutputHandler.output(sb, logger, "Exception during copyNetworkFilesToLocal stream to output, IO problem: " + e.getMessage(), e);
                e.printStackTrace();
                return false;
            }
        }`
    
    0 讨论(0)
  • 2020-12-06 19:57

    maybe adding auth to the second file:

    SmbFile dest = new SmbFile ("C:/SQLRESTORESTAGE/v2.bak",**auth**);
    

    using SmbFile dest = new SmbFile ("C:/SQLRESTORESTAGE",auth).canWrite you know if you have write permissions on the parent directory

    0 讨论(0)
提交回复
热议问题