You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 如何获取该路径下的文件列表且不触发文件夹相关异常?
  2. 后续如何单独获取该路径下的文件夹列表?

解决方案

问题1:获取文件列表且避免文件夹异常

报错核心原因是ssh2-sftp-client的list()方法默认会对每个列表条目执行stat操作(读取详细属性),如果服务器对文件夹有访问权限限制、或者路径拼接错误(比如报错里把服务器IP误拼进路径,形成了无效的/##.##.##.##/TestFolder1),就会触发异常。

解决步骤:

  1. 修正路径格式:确保/${params.SourcePath}是正确的绝对路径,避免重复斜杠或错误拼接IP。
  2. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 12:20:31