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

如何在Java中使用jcifs将文件从smb共享复制到本地驱动器?

阳凌
2023-03-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);
      }
}

文件未被复制。我收到一条消息“无法连接到服务器”,但程序显示dir。源文件的getDate()(以及文件名和长度)。因此,我认为目标文件夹(C:/SQLRESTORESTAGE/)存在问题。此外,我也提供了只用于读取源文件。你能帮我纠正一下密码或者给点建议吗?非常感谢。

共有3个答案

荆学民
2023-03-14

我让它工作了。在复制之前,我必须“创建”目标文件。尝试将下面的中间行添加到原始代码段中,看看是否有效。

SmbFile dest = new SmbFile ("C:/SQLRESTORESTAGE/v2.bak");
dest.createNewFile();
dir.copyTo(dest);
党博超
2023-03-14

经过多次尝试和失败,我唯一可靠的方法就是老一套地使用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;
        }
    }`
司徒博容
2023-03-14

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

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

使用SmbFile dest=new SmbFile(“C:/SQLRESTORESTAGE”,auth)。canWrite您知道自己是否拥有对父目录的写入权限

 类似资料:
  • 我想我可以使用smbfile.copyto(),但我不知道如何访问本地文件。如果我写了以下内容,我会得到一个连接错误: 这个问题与如何在Java中使用jcifs将文件从smb共享复制到本地驱动器有关?

  • 我想将本地目录(包括子目录)的所有内容复制到samba共享。 有没有一个简单的方法可以做到这一点?类似于SMB文件的内容。当源和目标位于SMB上时,copyTo()。

  • 我使用以下JCIFS代码将文件从本地磁盘复制到共享驱动器 复制10 mb文件需要10分钟以上。而当我直接复制同一个文件时,大约需要1分钟。我尝试了3种方法来复制文件(请参阅代码的注释部分),但没有一种方法显示出任何显著的差异。 是否有任何方法可以提高JCIFS的性能?

  • 试图从jcifs转移到jcifs-ng(最新的jar jcifs-ng-2.1.2.jar)以将文件复制到/从远程。我使用旧JCIFS的代码: 在stackoverflow中找到的示例很少,但看起来它们已经过时了。

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

  • 我想将一个文件从容器复制到我的本地。该文件是在执行python脚本后生成的,但由于当时,容器在运行后立即退出,并且无法使用命令。关于如何在管理复制文件之前防止容器退出的任何想法?下面是我的Dockerfile: 我使用这个命令来运行图像: