zoukankan      html  css  js  c++  java
  • sftp jsch文件移动备份的思路

    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的各种退出,各种关闭操作。

  • 相关阅读:
    【C语言】C语言static和extern区别
    【C语言】C语言外部变量和内部变量
    【C语言】C语言局部变量和全局变量
    【C语言】C语言常量和变量
    【C语言】C语言数据类型
    【C语言】C语言标识符
    【C语言】C语言关键字
    【C语言】外部函数和内部函数
    【C语言】C语言函数
    Android 测试 Appium、Robotium、monkey等框架或者工具对比
  • 原文地址:https://www.cnblogs.com/oktokeep/p/13185712.html
Copyright © 2011-2022 走看看