当前位置: 首页 > 知识库问答 >
问题:

JavaJCIFS如何正确地将文件从Samba复制到Windows本地?

闻人和泽
2023-03-14

我试图创建一个Java的应用程序,它可以将文件从Unix Samba共享复制到Windows文件夹。为了实现这一点,我使用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 !");

请帮助解决此问题。

共有2个答案

柳杰
2023-03-14

您需要适当的身份验证机制。例如,见:

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

}
郭志泽
2023-03-14

解决问题的选择


    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) {}
               }

来源于此

 类似资料:
  • 我的s3存储桶中有很多文件,所以是否有任何aws cli命令可用于在s3中查找带有前缀名的最新文件?如何将该文件从s3复制到本地文件夹?我可以使用Boto3或python库来实现这一点吗?

  • 如何将文件从HDFS复制到本地文件系统。文件下没有文件的物理位置,甚至没有目录。我如何将它们移到本地进行进一步的验证。我通过winscp进行了尝试。

  • 我想每小时将更新的文件从本地文件系统复制到Hadoop,因为我想放入cron。我可以使用任何hadoop命令将更新的文件从本地复制到Hadoop吗?

  • 我已经在Ubuntu 14.04上安装了hadoop。每当我将文件从本地文件系统复制到HDFS时,我都会出现以下错误。 我使用这个命令: 我遇到的错误是: 我是Linux环境的新手。我不明白哪个文件不存在。

  • 我正在尝试使用将应用程序容器中的文件夹复制到本地Windows文件夹。该设备运行的是Android5.1.1,没有根。 以下方法不起作用: 方法1 错误:找不到设备 cp:/data/data/droidsample.droidsample/files/metrolog/metrologs是一个目录(未复制)。 这也是行不通的。 方法5 cp:/data/data/droidsample.droi