From 1e9c92c015d1a284e47d627f95b35ca0bb833a87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8E=89=E5=86=9B?= Date: Thu, 24 Apr 2025 16:43:39 +0800 Subject: [PATCH] =?UTF-8?q?FTP=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0rename?= =?UTF-8?q?=E6=96=B9=E6=B3=95=EF=BC=8C=E6=94=B9=E6=96=87=E4=BB=B6/?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/extra/ftp/AbstractFtp.java | 8 ++ .../main/java/cn/hutool/extra/ftp/Ftp.java | 20 +++++ .../main/java/cn/hutool/extra/ssh/Sftp.java | 17 ++++ .../java/cn/hutool/extra/ssh/SshjSftp.java | 19 +++- .../java/cn/hutool/extra/ftp/FtpTest.java | 12 +++ .../java/cn/hutool/extra/ssh/SftpTest.java | 45 +++++++--- .../cn/hutool/extra/ssh/SshjSftpTest.java | 86 +++++++++++++++++++ 7 files changed, 193 insertions(+), 14 deletions(-) create mode 100644 hutool-extra/src/test/java/cn/hutool/extra/ssh/SshjSftpTest.java diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ftp/AbstractFtp.java b/hutool-extra/src/main/java/cn/hutool/extra/ftp/AbstractFtp.java index bdf695605..0bdd1cb95 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/ftp/AbstractFtp.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ftp/AbstractFtp.java @@ -250,6 +250,14 @@ public abstract class AbstractFtp implements Closeable { */ public abstract void recursiveDownloadFolder(String sourcePath, File destDir); + /** + * 重命名文件/目录 + * + * @param from 原路径 + * @param to 目标路径 + */ + public abstract void rename(String from, String to); + // ---------------------------------------------------------------------------------------------------------------------------------------- Private method start /** diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java b/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java index 96fbd275e..c9289cd5d 100755 --- a/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java @@ -726,6 +726,25 @@ public class Ftp extends AbstractFtp { } } + /** + * 重命名文件/目录 + * + * @param from 原路径 + * @param to 目标路径 + * + * @throws FtpException FTP异常 + */ + @Override + public void rename(String from, String to) throws FtpException { + try { + if (!client.rename(from, to)) { + throw new FtpException("rename [{}] to [{}] fail", from, to); + } + } catch (IOException e) { + throw new FtpException(e); + } + } + /** * 获取FTPClient客户端对象 * @@ -745,4 +764,5 @@ public class Ftp extends AbstractFtp { this.client = null; } } + } diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java index 412509098..9423a64a3 100755 --- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java @@ -647,6 +647,23 @@ public class Sftp extends AbstractFtp { } + /** + * 重命名文件/目录 + * + * @param from 原路径 + * @param to 目标路径 + * + * @throws JschRuntimeException Jsch异常 + */ + @Override + public void rename(String from, String to) throws JschRuntimeException { + try { + getClient().rename(from, to); + } catch (SftpException e) { + throw new JschRuntimeException(e); + } + } + /** * 获取远程文件 * diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/SshjSftp.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/SshjSftp.java index 617d11da3..c8468cec4 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/SshjSftp.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/SshjSftp.java @@ -88,7 +88,7 @@ public class SshjSftp extends AbstractFtp { * @param config FTP配置 * @since 5.3.3 */ - protected SshjSftp(FtpConfig config) { + public SshjSftp(FtpConfig config) { super(config); init(); } @@ -210,6 +210,23 @@ public class SshjSftp extends AbstractFtp { } } + /** + * 重命名文件/目录 + * + * @param from 原路径 + * @param to 目标路径 + * + * @throws FtpException FTP异常 + */ + @Override + public void rename(String from, String to) throws FtpException { + try { + sftp.rename(from, to); + } catch (IOException e) { + throw new FtpException(e); + } + } + @Override public void close() { IoUtil.close(this.session); diff --git a/hutool-extra/src/test/java/cn/hutool/extra/ftp/FtpTest.java b/hutool-extra/src/test/java/cn/hutool/extra/ftp/FtpTest.java index 33f392519..84692a4a1 100644 --- a/hutool-extra/src/test/java/cn/hutool/extra/ftp/FtpTest.java +++ b/hutool-extra/src/test/java/cn/hutool/extra/ftp/FtpTest.java @@ -13,6 +13,8 @@ import java.io.File; import java.io.IOException; import java.util.List; +import static org.junit.jupiter.api.Assertions.assertTrue; + public class FtpTest { @Test @@ -171,4 +173,14 @@ public class FtpTest { Console.log(ftp.pwd()); } } + + @Test + public void renameTest() { + final Ftp ftp = new Ftp("localhost", 21, "test", "test"); + + ftp.mkdir("/ftp-1"); + assertTrue(ftp.exist("/ftp-1")); + ftp.rename("/ftp-1", "/ftp-2"); + assertTrue(ftp.exist("/ftp-2")); + } } diff --git a/hutool-extra/src/test/java/cn/hutool/extra/ssh/SftpTest.java b/hutool-extra/src/test/java/cn/hutool/extra/ssh/SftpTest.java index e7429b873..f4c25a33c 100644 --- a/hutool-extra/src/test/java/cn/hutool/extra/ssh/SftpTest.java +++ b/hutool-extra/src/test/java/cn/hutool/extra/ssh/SftpTest.java @@ -1,33 +1,34 @@ package cn.hutool.extra.ssh; import cn.hutool.core.util.CharsetUtil; -import org.junit.Before; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import java.io.File; import java.util.List; +import static org.junit.jupiter.api.Assertions.*; + /** * 基于sshj 框架SFTP 封装测试. * * @author youyongkun * @since 5.7.18 */ -public class SftpTest { +class SftpTest { - private SshjSftp sshjSftp; + private static Sftp sftp; - @Before - @Disabled - public void init() { - sshjSftp = new SshjSftp("ip", 22, "test", "test", CharsetUtil.CHARSET_UTF_8); + @BeforeAll + public static void init() { + sftp = new Sftp("localhost", 22, "test", "test", CharsetUtil.CHARSET_UTF_8); } @Test @Disabled public void lsTest() { - List files = sshjSftp.ls("/"); + List files = sftp.ls("/"); if (files != null && !files.isEmpty()) { files.forEach(System.out::print); } @@ -36,19 +37,19 @@ public class SftpTest { @Test @Disabled public void downloadTest() { - sshjSftp.recursiveDownloadFolder("/home/test/temp", new File("C:\\Users\\akwangl\\Downloads\\temp")); + sftp.recursiveDownloadFolder("/home/test/temp", new File("C:\\Users\\akwangl\\Downloads\\temp")); } @Test @Disabled public void uploadTest() { - sshjSftp.upload("/home/test/temp/", new File("C:\\Users\\akwangl\\Downloads\\temp\\辽宁_20190718_104324.CIME")); + sftp.upload("/home/test/temp/", new File("C:\\Users\\akwangl\\Downloads\\temp\\辽宁_20190718_104324.CIME")); } @Test @Disabled public void mkDirTest() { - boolean flag = sshjSftp.mkdir("/home/test/temp"); + boolean flag = sftp.mkdir("/home/test/temp"); System.out.println("是否创建成功: " + flag); } @@ -56,12 +57,30 @@ public class SftpTest { @Disabled public void mkDirsTest() { // 在当前目录下批量创建目录 - sshjSftp.mkDirs("/home/test/temp"); + sftp.mkDirs("/home/test/temp"); } @Test @Disabled public void delDirTest() { - sshjSftp.delDir("/home/test/temp"); + sftp.delDir("/home/test/temp"); + } + + @Test + public void pwdTest() { +// mkDirsTest(); + sftp.mkdir("/ftp"); + sftp.cd("/ftp"); + String pwd = sftp.pwd(); + System.out.println("当前目录: " + pwd); + assertEquals("/ftp", pwd); + } + + @Test + public void renameTest() { + sftp.mkdir("/ftp-1"); + assertTrue(sftp.exist("/ftp-1")); + sftp.rename("/ftp-1", "/ftp-2"); + assertTrue(sftp.exist("/ftp-2")); } } diff --git a/hutool-extra/src/test/java/cn/hutool/extra/ssh/SshjSftpTest.java b/hutool-extra/src/test/java/cn/hutool/extra/ssh/SshjSftpTest.java new file mode 100644 index 000000000..6c5c8ef63 --- /dev/null +++ b/hutool-extra/src/test/java/cn/hutool/extra/ssh/SshjSftpTest.java @@ -0,0 +1,86 @@ +package cn.hutool.extra.ssh; + +import cn.hutool.core.util.CharsetUtil; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * 基于sshj 框架SFTP 封装测试. + * + * @author youyongkun + * @since 5.7.18 + */ +class SshjSftpTest { + + private static SshjSftp sshjSftp; + + @BeforeAll + public static void init() { + sshjSftp = new SshjSftp("localhost", 22, "test", "test", CharsetUtil.CHARSET_UTF_8); + } + + @Test + @Disabled + public void lsTest() { + List files = sshjSftp.ls("/"); + if (files != null && !files.isEmpty()) { + files.forEach(System.out::print); + } + } + + @Test + @Disabled + public void downloadTest() { + sshjSftp.recursiveDownloadFolder("/home/test/temp", new File("C:\\Users\\akwangl\\Downloads\\temp")); + } + + @Test + @Disabled + public void uploadTest() { + sshjSftp.upload("/home/test/temp/", new File("C:\\Users\\akwangl\\Downloads\\temp\\辽宁_20190718_104324.CIME")); + } + + @Test + @Disabled + public void mkDirTest() { + boolean flag = sshjSftp.mkdir("/home/test/temp"); + System.out.println("是否创建成功: " + flag); + } + + @Test + @Disabled + public void mkDirsTest() { + // 在当前目录下批量创建目录 + sshjSftp.mkDirs("/home/test/temp"); + } + + @Test + @Disabled + public void delDirTest() { + sshjSftp.delDir("/home/test/temp"); + } + + @Test + public void pwdTest() { +// mkDirsTest(); + sshjSftp.cd("/ftp"); + String pwd = sshjSftp.pwd(); + System.out.println("当前目录: " + pwd); + assertEquals("/ftp", pwd); + } + + @Test + public void renameTest() { + sshjSftp.mkdir("/ftp-1"); + assertTrue(sshjSftp.exist("/ftp-1")); + sshjSftp.rename("/ftp-1", "/ftp-2"); + assertTrue(sshjSftp.exist("/ftp-2")); + } +}