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

如何使用JavaSFTP库JSch将文件从一个目录传输到另一个目录?

宓和同
2023-03-14

我需要使用JSch库编程文件传输。我有一个包含两个文件夹的简单目录-

在SFTP\u 1文件夹中,我有一个位图图像。而SFTP\U 2文件夹只是一个空文件夹。我的目标是使用SFTP将图像从SFTP\U 1传输到SFTP\U 2。

以下是迄今为止我的代码:

FileTransfer fileTransfer = new FileTransfer();              
      
JSch jsch = new JSch();

String host = "127.0.0.1";
int port = 22;

String user = "user";
Session session = jsch.getSession(user, host, port);      
session = jsch.getSession("username", "127.0.0.1", 22);
session.connect();

ChannelSftp sftp = null;
sftp = (ChannelSftp)session.openChannel("sftp") ; //channel;

sftp.rename(
    "C:\\Users\\ADMIN\\Desktop\\Work\\ConnectOne_Bancorp\\Java_Work\\SFTP_1\\house.bmp",
    "C:\\Users\\ADMIN\\Desktop\\Work\\ConnectOne_Bancorp\\Java_Work\\SFTP_2\\house.bmp");
session.disconnect();

我想做的是简单地将文件从我机器中的一个目录传输到另一个目录。任何提示,谢谢!

共有3个答案

商兴朝
2023-03-14

如果原始海报实际上是在两个不同的FTP站点之间寻找JSch的工作示例,那么下面是:

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
...
JSch jsch = new JSch();
JSch session = null;
try {
  session = jsch.getSession(userid, sourceservername, sourceserverport);
  session.setPassword(sourceserverpassword);
  Properties props = new Properties();
  props.put("StrictHostKeyChecking", "no");
  session.setConfig(props);
  session.connect();
  Channel channel = session.openChannel("sftp");
  channel.connect();
  ChanelSftp channelsftp = (ChannelSftp) channel;
  channelsftp.cd(sourcefilepath);
  channelsftp.lcd(localfilepath);
  FileOutputStream fos = new FileOutputStream(new File(localfilepath + "/" + localfilename));
  channelsftp.get(sourcefilename, fos);
  fos.flush();
  fos.close();
  channelsftp.disconnect()
  session.disconnect();
} catch (Exception e) {
  e.printStackTrace();
}

实际上,您可以将这些操作分解为单独的try{}catch(){}阻塞语句,以便引入更细粒度的错误报告,以及添加任何信息输出行来通知用户状态等。但这将帮助您做到这一点。诚然,虽然JSch示例比免费软件库中的大多数此类示例都要好,即使是像这样的好示例,但其中可能存在一些遗漏,这些遗漏可能会影响或破坏您的工作尝试。如果不是原始海报的话,希望这能有所帮助,然后其他人会寻找一个可行的JSch示例。一旦你让它发挥作用,它确实会变得很有魅力,所以值得你费心。

蒲寂离
2023-03-14

实际上,JSch是为远程工作而设计的,文件系统修改就是此类工作之一@Edwin Buck answer使用网络处理远程主机上的本地文件夹。有更好的方法:

session.connect();
ChannelExec exec = (ChannelExec) session.openChannel("exec");
exec.setCommand("cp a.out b.out");
exec.connect();

我手头没有windows,因此我的示例是针对unix的。但想法很简单:在远程主机上执行copy命令。

韩鸿
2023-03-14

请注意,要在两个文件夹之间复制,不需要使用SFTP。可以从一个文件夹复制到另一个文件夹,而无需涉及主要用于远程复制文件的SFTP协议,无论是从本地机器复制到远程机器,还是从远程机器复制到(相同或不同的)远程机器,或者从远程机器复制到本地机器。

这是因为FTP是基于网络的协议。所以使用它(或任何相关协议)将使用网络(或模拟网络)。

JSch提供的安全性旨在防止网络上发生的某些类型的攻击。它不会在机器内提供任何额外的安全性。

要在单台机器上的文件夹之间复制文件,最简单的方法是不使用JSch,就像这样

private static void copyFileUsingJava7Files(File source, File dest)
        throws IOException {
    Files.copy(source.toPath(), dest.toPath());
}

还有其他技术,如果你真的想使用JSch,你需要意识到JSch必须提供很多“额外”信息才能连接到你所在的机器,因为它会尝试连接到这台机器,就好像它是从整个网络连接一样

Session sessionRead = jsch.getSession("username", "127.0.0.1", 22);
sessionRead.connect();

Session sessionWrite = jsch.getSession("username", "127.0.0.1", 22);
sessionWrite.connect();

ChannelSftp channelRead = (ChannelSftp)sessionRead.openChannel("sftp");
channelRead.connect();

ChannelSftp channelWrite = (ChannelSftp)sessionWrite.openChannel("sftp");
channelWrite.connect();

PipedInputStream pin = new PipedInputStream(2048);
PipedOutputStream pout = new PipedOutputStream(pin);

channelRead.get("/path/to/your/file/including/filename.txt", pout);
channelWrite.put(pin, "/path/to/your/file/destination/including/filename.txt");

channelRead.disconnect();
channelWrite.disconnect();

sessionRead.disconnect();
sessionWrite.disconnect();

上面的代码缺乏错误检查、异常处理和回退例程,无法判断文件是否丢失、网络是否正常等。但您应该了解主要内容。

同样显而易见的是,在不需要网络协议的情况下使用网络协议会打开更多故障场景的大门。只有当您的程序很快就要复制不同时位于您的计算机上的文件时,才使用SFTP方法。

 类似资料:
  • 问题内容: 我需要使用JSch库对文件传输进行编程。我有一个包含两个文件夹的简单目录 在SFTP_1文件夹中,我有一个位图图像。该SFTP_2文件夹只是一个空文件夹。我的目标是使用SFTP将图像从SFTP_1传输到SFTP_2。 到目前为止,这是我的代码: 我想做的只是将文件从计算机中的一个目录传输到另一个目录。任何提示表示赞赏,谢谢! 问题答案: 请注意,要在两个文件夹之间进行复制,不需要使用S

  • 问题内容: 说我在目录中还有一个文件。如何替换为使用?我在Windows XP上,跨平台的解决方案会很棒,但是Windows是首选。 问题答案: 您可以使用以下 功能: 在其手册页中引用了几个相关的句子: 将文件源的副本复制到dest。 如果目标文件已经存在,它将被覆盖。

  • 我正在使用QT,我无法找到如何将文件从一个目录复制到另一个目录?我怎样才能做到这一点?

  • 问题内容: 我想使用Java将文件从一个目录复制到另一个目录(子目录)。我有一个包含文本文件的目录dir。我遍历dir中的前20个文件,并想将它们复制到dir目录中的另一个目录中,该目录是我在迭代之前创建的。在代码中,我想将(代表第ith个文本文件或审阅)复制到。我怎样才能做到这一点?似乎没有这样的功能(或者我找不到)。谢谢。 问题答案: 目前,这应该可以解决你的问题 从类阿帕奇公地IO库,因为1

  • 我使用SSH SFTP采样器在jmeter中进行SFTP测试。我可以将文件从Ftp位置获取/Put到本地位置,反之亦然。但我无法将文件从同一FTP位置的一个目录移动到另一个目录。 请建议。