0

0

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

幻夢星雲

幻夢星雲

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

|

560人浏览过

|

来源于php中文网

原创

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

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

FtpWebRequest 列出 FTP 目录内容最可靠

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

关键点在于:必须显式设置 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 读取导致乱码或截断。

  • 先用 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。

魔法映像企业网站管理系统
魔法映像企业网站管理系统

技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作

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

别忽略 FtpWebResponse.StatusCode 和异常细节

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

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

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

615

2023.10.24

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

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

2178

2024.10.24

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

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

389

2023.09.22

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

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

328

2023.10.09

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

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

420

2023.10.16

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

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

122

2023.10.18

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

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

333

2023.10.31

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

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

445

2024.04.10

TensorFlow2深度学习模型实战与优化
TensorFlow2深度学习模型实战与优化

本专题面向 AI 与数据科学开发者,系统讲解 TensorFlow 2 框架下深度学习模型的构建、训练、调优与部署。内容包括神经网络基础、卷积神经网络、循环神经网络、优化算法及模型性能提升技巧。通过实战项目演示,帮助开发者掌握从模型设计到上线的完整流程。

0

2026.02.10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9万人学习

C 教程
C 教程

共75课时 | 4.6万人学习

C++教程
C++教程

共115课时 | 16.9万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号