Node.js+Typescript下SFTP文件/文件夹列表获取报错及分类查询求助
SFTP路径列表获取异常及文件/文件夹分离需求
我使用Node.js v16.18.0、Typescript v10.9.1及ssh2-sftp-client已成功建立SFTP服务器连接,目标是遍历所有文件并复制至AWS S3。当前需要获取SFTP指定路径下的文件列表,示例路径包含以下内容:
- TestFolder1(文件夹)
- TestFolder2(文件夹)
- Afile.txt(文件)
- Bfile.txt(文件)
- Zfile.txt(文件)
实现代码如下:
let Client = require('ssh2-sftp-client'); let sftp = new Client(); await sftp.connect({ host: params.SourceAddress, port: params.SourcePort, username: params.SourceUserId, password: params.SourcePassword, privateKey: params.SourceSftpKey, }); // 异常发生在这一行 const files = await sftp.list(`/${params.SourcePath}`);
执行时出现报错:
Error: list: No such file /##.##.##.##/TestFolder1
注:当路径下仅保留文件时,代码可正常运行。现求助两个问题:
- 如何获取该路径下的文件列表且不触发文件夹相关异常?
- 后续如何单独获取该路径下的文件夹列表?
解决方案
问题1:获取文件列表且避免文件夹异常
报错核心原因是ssh2-sftp-client的list()方法默认会对每个列表条目执行stat操作(读取详细属性),如果服务器对文件夹有访问权限限制、或者路径拼接错误(比如报错里把服务器IP误拼进路径,形成了无效的/##.##.##.##/TestFolder1),就会触发异常。
解决步骤:
- 修正路径格式:确保
/${params.SourcePath}是正确的绝对路径,避免重复斜杠或错误拼接IP。 - 调用
list()时关闭stat解析,仅获取基础元数据:
// 关闭stat解析,避免因文件夹权限/路径问题引发的异常 const allItems = await sftp.list(`/${params.SourcePath}`, { stat: false }); // 过滤出所有文件 const files = allItems.filter(item => !item.isDirectory);
问题2:单独获取文件夹列表
基于上述获取的完整条目列表,直接过滤出标记为文件夹的条目即可:
const allItems = await sftp.list(`/${params.SourcePath}`, { stat: false }); // 过滤出所有文件夹 const folders = allItems.filter(item => item.isDirectory);
如果需要确保文件夹的有效性,可在过滤后对每个文件夹单独执行stat验证,但一般情况下isDirectory标记足够可靠。
内容的提问来源于stack exchange,提问作者spacedog
相关产品推荐
相关产品推荐

