SFTP工具类异常
# SFTP工具类异常
# 文件存在,却读取不到。
# 问题描述:
SFTP上有文件,用SFTP工具类读取提示No such file
读取路径:home/upload/BILLING_20241222.ok
依赖版本
<dependency>
<groupId>cn.lovecyy</groupId>
<artifactId>relaxed-spring-boot-starter-sftp</artifactId>
<version>1.4.12</version>
</dependency>
# 构成原因:
路径不带前缀 /(即使用相对路径而不是绝对路径),会受到当前工作目录(Working Directory)的影响。
# 路径类型说明
- 绝对路径:
- 路径以
/开头,例如/home/user/file.txt。 - 这种路径是从文件系统的根目录开始解析,通常不受当前工作目录的影响。
- 路径以
- 相对路径:
- 路径不以
/开头,例如file.txt或./file.txt。 - 相对路径会以 SFTP 当前工作目录为基准解析。
- 路径不以
# 当前工作目录的影响
- 在 SFTP 会话中,
ChannelSftp有一个当前工作目录(可以通过pwd()查看)。 - 如果使用相对路径,SFTP 会基于当前工作目录查找文件。
# 示例:路径解析
假设当前工作目录是 /home/user:
使用相对路径:
sftp.lstat("file.txt"); // 实际路径为 /home/user/file.txt使用绝对路径:
sftp.lstat("/etc/file.txt"); // 实际路径为 /etc/file.txt
# 潜在问题
- 路径错误:
- 如果不带
/前缀,而当前工作目录不是期望的路径,可能会导致文件找不到。 - 示例:当前目录是
/home/user,但你希望访问/var/log/file.txt,使用file.txt会查找/home/user/file.txt,导致文件不存在。
- 如果不带
- 工作目录改变:
- 如果代码或其他操作更改了 SFTP 的当前工作目录(例如使用
cd()方法),相对路径会指向错误的位置。
- 如果代码或其他操作更改了 SFTP 的当前工作目录(例如使用
- 路径不明确:
- 相对路径可能依赖外部环境,导致代码的可移植性和可维护性变差。
# 解决方案:
优先使用绝对路径:可以避免因工作目录改变而引起的路径解析问题。
检查当前工作目录:如果必须使用相对路径,确保在调用前通过
pwd()确认当前工作目录。设置工作目录:如果需要一致性,可以显式设置工作目录:
sftp.cd("/home/user"); sftp.lstat("file.txt"); // 基于 /home/user
# 示例代码
ChannelSftp sftp = (ChannelSftp) session.openChannel("sftp");
sftp.connect();
try {
// 打印当前工作目录
System.out.println("Current Directory: " + sftp.pwd());
// 使用绝对路径
SftpATTRS attrs = sftp.lstat("/absolute/path/to/file.txt");
System.out.println("File Size: " + attrs.getSize());
// 使用相对路径
sftp.cd("/home/user");
attrs = sftp.lstat("file.txt"); // 相对路径基于 /home/user
System.out.println("File Size: " + attrs.getSize());
} catch (SftpException e) {
e.printStackTrace();
} finally {
sftp.disconnect();
}
# 总结
如果路径不带前缀 /,lstat 会将其解析为相对路径,并基于当前工作目录查找文件。为避免问题,建议优先使用绝对路径或在操作前明确设置工作目录。