java 使用jcifs将整个本地目录复制到smb共享?

owfi6suc  于 2023-03-11  发布在  Java
关注(0)|答案(2)|浏览(198)

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

i5desfxk

i5desfxk1#

如果将源和目标都定义为SmbFiles,则只需使用SmbFile.copyTo()。

String userName = "USERNAME";
  String password = "PASSWORD";
  String user = userName + ":" + password;  

  String destinationPath = "smb://destinationlocation.net";
  String sourcePath = "smb://sourcelocation.net";

  NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(user);               

  SmbFile dFile = new SmbFile(destinationPath, auth);
  SmbFile sFile = new SmbFile(sourcePath, auth);

  sFile.copyTo(dFile);

目录及其内容应全部从源位置复制到目标位置。

khbbv19g

khbbv19g2#

我刚才做了一些类似的事情,发现了这个将近10年前的问题。下面的代码将一个本地文件夹及其所有子文件夹和文件复制到一个SMB共享。
它使用java.nio中的Files.walk来“遍历”所有本地文件和文件夹。如果它是一个文件夹,则调用mkdirs(),该函数将在共享上创建所有所需的文件夹(如果这些文件夹尚未存在)。如果需要,将创建文件,并使用Files.copy复制文件内容。如果共享上已经存在某个文件,则将覆盖其内容。
代码使用try-with-resource块来确保打开的资源被关闭。

String srcUrl = "path/to/local/folder";
String destUrl = "smb://user:password@host/share";

try(Stream<Path> pathStream = Files.walk(Paths.get(srcUrl))) {
    pathStream.forEach(sourcePath -> {
        try {
            SmbFile destinationFile =
                new SmbFile(destUrl + sourcePath.toString().substring(srcUrl.length()));

            if(Files.isDirectory(sourcePath)) {
                if(!destinationFile.exists()) {
                    // create any missing directories
                    destinationFile.mkdirs();
                }
            }
            else {
                // it's a file -> create file (if it's not already there) and copy content
                if(!destinationFile.exists()) {
                    destinationFile.createNewFile();
                }

                try(SmbFileOutputStream out = new SmbFileOutputStream(destinationFile)) {
                    Files.copy(sourcePath, out);
                }
            }
        }
        catch(IOException e) {
            throw new RuntimeException(e);
        }
    });
}
catch(Exception e) {
    logger.error("failed to copy from {} to {}", srcUrl, destUrl, e);
}

相关问题