讲师中心 微信公众号
AI工具推荐 视频效率加速

C# FTP文件操作 C#如何列出FTP服务器上的文件列表

夏晨大大_3665

夏晨大大_3665

发布时间:2026-02-10 08:21:02

|

680人浏览过

|

来源于php中文网

原创

最可靠方式是用 FtpWebRequest 发送 MLSD 命令(失败时降级 LIST),显式设置 Method、Credentials 和 ISO-8859-1 编码解析响应,校验 StatusCode,注意路径格式与被动模式。

c# ftp文件操作 c#如何列出ftp服务器上的文件列表

用 FtpWebRequest 列出 FTP 目录内容最可靠

直接调用 FtpWebRequest 是 C# 标准库中唯一原生支持 FTP 列目录的方式,WebClient 和 HttpClient 都不支持 LIST 或 MLSD 命令。别被网上某些“一行代码搞定”的误导骗了——那些基本是伪造响应或依赖第三方库。

关键点在于:必须显式设置 Method 为 "LIST" 或 "MLSD",且不能用 GET;否则服务器返回 500 错误或空响应。

  • LIST 兼容老服务器,但解析依赖服务端格式(Unix 风格 / DOS 风格),需自行正则提取文件名
  • MLSD 是 RFC 3659 标准,返回结构化数据(含时间、权限、类型),推荐优先使用,但部分旧 FTP 服务器不支持
  • 务必设置 Credentials,匿名访问需用 new NetworkCredential("", "")
  • 超时建议设为 Timeout = 30000,FTP 控制连接容易卡住

MLSD 响应解析要注意字段顺序和编码

MLSD 返回的是类似 modify=20231201102234;size=1024;type=file;name=report.pdf 的键值对行,每行末尾有换行符,且可能含非 ASCII 字符(如中文文件名)。常见坑是直接 Encoding.UTF8 读取导致乱码或截断。

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载
  • 先用 response.GetResponseStream() 获取流,再用 StreamReader 指定 Encoding.GetEncoding(ISO-8859-1) 读取(FTP 协议规定 MLSD 元数据字段必须用 ISO-8859-1 编码)
  • 文件名在 name= 后,但可能含 = 或分号,要用最后一个 name= 截取,并去除前后空格和引号
  • type=file 表示文件,type=dir 表示目录,别只靠扩展名判断
var request = (FtpWebRequest)WebRequest.Create("ftp://example.com/");
request.Method = "MLSD";
request.Credentials = new NetworkCredential("user", "pass");
using var response = (FtpWebResponse)request.GetResponse();
using var stream = response.GetResponseStream();
using var reader = new StreamReader(stream, Encoding.GetEncoding("ISO-8859-1"));
string line;
while ((line = reader.ReadLine()) != null) {
    var nameMatch = Regex.Match(line, @"name=([^;]+)");
    if (nameMatch.Success) {
        string fileName = nameMatch.Groups[1].Value.Trim('"', ' ');
        // 处理 fileName
    }
}

遇到 550 Access denied 或空列表先检查路径写法

FTP 路径不是 URL 路径:ftp://host/a/b/ 中的 /a/b/ 是服务器上的绝对路径(从根目录起),而 ftp://host//a/b/(双斜杠)可能被某些服务器解释为用户主目录下的 a/b。列出根目录就用 ftp://host/,列子目录必须带尾部斜杠,否则部分服务器返回 550。

  • 路径中避免反斜杠 \,全部用正斜杠 /
  • 用户名含 @ 符号时,URL 编码它(如 user%40domain),否则 WebRequest.Create 解析失败
  • 被动模式(PASV)是默认且必需的,若企业防火墙拦截 PASV 端口,需手动启用主动模式:request.UsePassive = false,但极少需要
  • 某些服务器要求先 CWD 切换工作目录,再 LIST,此时得发两次请求

别忽略 FtpWebResponse.StatusCode 和异常细节

FTP 错误不都抛 WebException,有些静默返回空流或错误状态码。比如服务器返回 530 Not logged in 时,response.StatusCode 是 FtpStatusCode.NotLoggedIn,但程序可能继续往下读空流,最终得到空列表。

  • 始终检查 ((FtpWebResponse)response).StatusCode 是否为 FtpStatusCode.CommandOK 或 FtpStatusCode.DataAlreadyOpen
  • 捕获 WebException 后,读取 e.Response 再转 FtpWebResponse,从中取 StatusCode 和 StatusDescription
  • 调试时打印完整 StatusDescription,像 "550 Permission denied" 比泛泛的异常消息有用得多

真实环境里,FTP 服务器五花八门,有的连 MLSD 都没实现,有的返回 DOS 格式 LIST 输出却声称支持 MLSD。先试 MLSD,失败再降级到 LIST + 正则解析,比硬写一种方式靠谱得多。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

相关专题

更多
常见的编码方式
常见的编码方式

常见的编码方式有ASCII编码、Unicode编码、UTF-8编码、UTF-16编码、GBK编码等。想了解更多编码方式相关内容,可以阅读本专题下面的文章。

1528

2023.10.24

a和A对应的ASCII码数值
a和A对应的ASCII码数值

a的ascii码是65,a的ascii码是97;ascii码表中,一个字母的大小写数值相差32,一般知道大写字母的ascii码数值,其对应的小写字母的ascii码数值就算出来了,是大写字母的ascii码数值“+32”。想了解更多相关的内容,可阅读本专题下面的相关文章。

5627

2024.10.24

unix和linux的区别
unix和linux的区别

unix和linux的区别包括发展历史、开源性、发行版本、内核、文件系统、应用程序兼容性和用户界面等。本专题为大家提供unix和linux相关的文章、下载、课程内容,供大家免费下载体验。

3313

2023.09.22

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

3007

2023.10.09

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

2973

2023.10.16

asp连接access数据库的方法
asp连接access数据库的方法

连接的方法:1、使用ADO连接数据库;2、使用DSN连接数据库;3、使用连接字符串连接数据库。想了解更详细的asp连接access数据库的方法,可以阅读本专题下面的文章。

3113

2023.10.18

access和trunk端口的区别
access和trunk端口的区别

access和trunk端口的区别是Access端口用于连接终端设备,提供单个VLAN的接入,而Trunk端口用于连接交换机之间,提供多个VLAN的传输;Access端口只传输属于指定VLAN的数据,而Trunk端口可以传输多个VLAN的数据,并使用VLAN标签进行区分。想了解更多access和trunk端口相关内容,可以阅读本专题下面的文章。

448

2023.10.31

access怎么导入数据
access怎么导入数据

access导入数据步骤:1. 选择数据源 2. 选择要导入的文件 3. 指定导入选项 4. 选择导入目标 5. 预览数据 6. 导入数据即可。想了解更多access的相关内容,可以阅读本专题下面的文章。

5105

2024.04.10

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn