背景
常用的 Java SSH 操作工具包是 jsch ,FTP 工具包 commons-net ,本文将总结 Java 程序通过 SFTP 协议和 FTP 协议访问远程文件的过程中,需要注意的路径问题。
本文主要包括下面三个问题:
- FTPClient 获取当前用户根目录的方法
- ChannelSftp 获取当前用户根目录的方法。
- 目录切换时,如果是相对目录,可能存在的问题。
- 目标目录不存在时,逐级创建目录的方法。
相对路径操作注意事项
jsch 通过 ChannelSftp 访问 SFTP 时,获取当前登录用户根目录的方法有两种:
pwd()
方法getHome()
方法
两者在刚刚登录成功后返回的值是一样的,都是当前登录用户的 home 目录。
FTPClient 获取当前登录用户的根目录方法为:printWorkingDirectory()
。
注意:如果操作的目标目录是相对路径,例如目标目录变量名称为 dir,判断绝对路径的方法为:
1 | bash复制代码boolean isNotAbsolutePath = !dir.startWith(File.separator); |
修正操作目标路径为绝对路径后,后面的操作就不会报文件不存在错误了。
listFiles 的内容
FTPClient 的 listFiles 文件列表中不包含 .
和 ..
这两个特殊的文件,但是使用 jsch 的 ChannelSftp
的 ls 直接列出的文件却包含 .
和 ..
。
所以在遍历文件过程中,对于 Sftp 访问操作,需要排除这两种特殊文件。
相对路径时 ls 或 cd 异常问题
如果使用相对路径,ChannelSftp 的 ls 操作会异常:
1 | java复制代码com.jcraft.jsch.SftpException: No such file |
解决办法,就是第二部分「相对路径操作注意事项」的内容,必须在真正切换目录之前拼接上当前登录用户的根目录。
逐级创建目录的方法
Java 的 FTP 和 SFTP 工具操作是的 mkdir 方法,当父级目录不存在时,直接用目录创建方法会失败,只能逐级创建每个目录。
确实有些场景下需要自动创建一个多层级的新目录,解决办法就是逐级拆解路径,判断当前路径是否存在,如果不存在,就创建,直到到达最后一级。
FTPClient 逐级创建一个目标目录 dirPath
的方法:
1 | bash复制代码void createFilePath(FTPClient ftpClient, String filePath) { |
ChannelSftp 逐级创建一个目标目录 dirPath
的方法:
1 | bash复制代码private boolean createFilePath(ChannelSftp channelSftp, String filePath) { |
FTPClient 有 changeWorkingDirectory 方法返回一个 boolean 值,可以判断目录是否存在,不存在可以执行创建操作;ChannelSftp 的 cd 没有返回值,所以直接mkdir 逐级创建。
本文转载自: 掘金