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

VB.NET自定义FTP服务器NLST命令单次仅返回单个条目问题求助

问题:VB.NET开发的FTP守护进程NLST命令仅返回单个文件/文件夹条目

我正在使用VB.NET开发FTP守护进程,当客户端发送NLST命令获取指定路径下的文件或文件夹时,程序每次仅返回单个文件/文件夹名称,需多次执行ls命令才能获取全部内容。注:CMD中执行ls会自动转换为NLST命令,此为正常情况,但单次返回单个条目的问题亟待解决。

现有实现代码

Case "NLST"
    Dim str As New StringBuilder()
    Dim di = New DirectoryInfo(work_dir)

    For Each file In di.EnumerateFileSystemInfos()
        str.Append(file.Name).Append(Environment.NewLine)
    Next
    SendResponse(writer, str.ToString().TrimEnd)

问题排查与修复方案

1. 协议格式不规范

NLST命令的响应必须严格遵循FTP协议流程:

  • 先通过控制连接发送150 Opening ASCII mode data connection for file list状态码
  • 在数据连接中传输所有文件名(每个名称占一行)
  • 最后发送226 Transfer complete结束状态码

你的代码可能直接将列表内容发送到控制连接,导致客户端无法完整接收数据。

2. 换行符与发送方式问题

FTP协议要求换行符为\r\n(即VB.NET中的vbCrLf),而非系统默认的Environment.NewLine;同时列表内容必须通过数据连接传输,而非控制连接。修改代码如下:

Case "NLST"
    Dim str As New StringBuilder()
    Dim di = New DirectoryInfo(work_dir)

    For Each file In di.EnumerateFileSystemInfos()
        str.Append(file.Name).Append(vbCrLf) ' 使用标准FTP换行符
    Next

    ' 按协议流程发送响应
    SendResponse(writer, "150 Opening ASCII mode data connection for file list")
    ' 通过数据连接发送文件列表(需确保数据连接已正确建立)
    SendDataOverDataConnection(str.ToString().TrimEnd(vbCrLf.ToCharArray()))
    SendResponse(writer, "226 Transfer complete")

3. 检查SendResponse方法实现

确认SendResponse是否存在输出截断问题,比如限制单次发送字节数、未正确处理字符串编码转换,导致部分内容未被客户端接收。

内容的提问来源于stack exchange,提问作者Necro PC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 04:33:31