如何从SMB共享文件复制到使用JCIFS在Java中的本地驱动器?(How to copy file

2019-07-03 19:14发布

任何人可以帮助我从共享文件夹到本地驱动器复制文件? 我的代码是:

import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import jcifs.smb.SmbFileOutputStream;;


public class smb {

      /**
      * @param args
      * @throws IOException
       */
      public static void main(String[] args) throws IOException {
            // TODO Auto-generated method stub


          String urlToBackUpFile = "smb://ip/backup$/test.txt"; 
          System.out.println("smb folder of source file" + urlToBackUpFile);
          NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null, "login", "pass");


            SmbFile dir = new SmbFile(urlToBackUpFile, auth);
            System.out.println(dir.getDate());
            SmbFile dest = new SmbFile ("C:/SQLRESTORESTAGE/v2.bak");
            dir.copyTo(dest);
      }
}

文件的文件不会被复制。 我收到“无法连接到服务器”的消息,但PROGRAMM显示源文件的dir.getDate()(和文件名,lenght)。 因此,我认为与目标文件夹的问题(C:/ SQLRESTORESTAGE /)。 此外,我只有阅读源文件proviledges。 你能帮我cirrect代码或建议的东西吗? 谢谢。

Answer 1:

也许添加auth到第二个文件:

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

使用SmbFile dest = new SmbFile ("C:/SQLRESTORESTAGE",auth).canWrite你知道,如果你有对父目录的写权限



Answer 2:

许多试验和失败后,只有为我工作的可靠方法是去老同学和使用的FileInputStream和FileOutputStream中,像这样:

   `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;
        }
    }`


Answer 3:

我得到它的工作。 我不得不做副本前“创造”的目标文件。 尝试添加下面的中间线到你原来的代码片段,并看看是否能工程。

SmbFile dest = new SmbFile ("C:/SQLRESTORESTAGE/v2.bak");
dest.createNewFile();
dir.copyTo(dest);


Answer 4:

这对于澄清。 “登录失败:未知的用户名或密码错误。” 可以显示例如,当您在使用1.2.25 1.3.18但不是。 这可能是因为不同的兼容性设置:

  1. jcifs.smb.lmCompatibility = 0或1:发送LM和NTLM 2)
  2. jcifs.smb.lmCompatibility = 2:发送NTLM在两个字段3)
  3. jcifs.smb.lmCompatibility = 3,4或5:只发送LMV2

第一种方式是NtlmPasswordAuthentication之前使用它

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

它可以解决这个问题。



Answer 5:

您必须使用file:协议

SmbFile dest = new SmbFile ("file:" + "C:/SQLRESTORESTAGE/v2.bak");


文章来源: How to copy file from smb share to local drive using jcifs in Java?