1.jsch jar包不支持mv cp等移动复制的功能,转换思路,sftp下载文件到本地服务器,目录可以考虑使用/年/月/日层级。
2.然后sftp下载操作完毕,记录一张文件操作表,记录下载状态。
3.在定时备份的任务中,根据文件操作表的下载状态,循环操作:首先检查本地是否该文件存在,存在则在sftp jsch rm删除该文件。
4.最后将本地的文件批量上传到sftp服务器需要转移备份的新文件夹目录上面实现。目录可以考虑使用/年/月/日层级。
jsch支持一次mkdir一个目录,而不允许一次创建多层级目录。需要遍历:
String[] folders = path.split( "/" ); for ( String folder : folders ) { if ( folder.length() > 0 ) { try { sftp.cd( folder ); } catch ( SftpException e ) { sftp.mkdir( folder ); sftp.cd( folder ); } } }
批量上传(关键代码)
private static ChannelSftp upload(String path, String dst, SftpProgressMonitor monitor) throws SftpException { File file = new File(path); if (!file.exists()) { return null; } ChannelSftp chSftp = null; try { chSftp = ChannelSftpSingleton.getInstance().getChannelSftp(); } catch (JSchException e) { e.printStackTrace(); } if (chSftp == null) { return null; } if (file.isDirectory()) { File[] files = file.listFiles(); if (files == null || files.length <= 0) { return null; } for (File f : files) { String fp = f.getAbsolutePath(); if (f.isDirectory()) { String mkdir = dst + "/" + f.getName(); try { chSftp.cd(mkdir); } catch (Exception e) { chSftp.mkdir(mkdir); } upload(fp, mkdir, monitor); } else { chSftp.put(fp, dst, monitor, ChannelSftp.OVERWRITE); } } } else { String fp = file.getAbsolutePath(); chSftp.put(fp, dst, monitor, ChannelSftp.OVERWRITE); } return chSftp; }
测试类
String src = "本地文件夹目录"; String dst = "sftp文件夹目录"; try { uploadFilesToServer(src, dst, new SftpProgressMonitor() { @Override public void init(int i, String src, String dst, long size) { System.out.println("正在上传 " + src + " 到 " + dst + ",文件大小:" + (double) (size) + "b"); } @Override public boolean count(long l) { return true; } @Override public void end() { System.out.println("上传成功"); } }); } catch (Exception e) { e.printStackTrace(); }
最后需处理jsch的各种退出,各种关闭操作。