关于C#连接FTP时路径问题的解决方法
作者:菜鸟葫芦娃 发布时间:2021-10-03 18:53:50
标签:c#,ftp,路径
前言
本文主要给大家介绍了关于C#连接FTP时路径问题的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍:
今天在开发项目时,需要连接FTP获取文件,其中关键的一步就是判断能否连接FTP以及FTP上的文件是否存在
判断的代码如下:
/// <summary>
/// 测试是否可以成功连接FTP和判断文件是否存在
/// </summary>
/// <param name="ftpServerFilePath">FTP上文件地址</param>
/// <param name="ftpUserId">FTP登陆用户名</param>
/// <param name="ftpPwd">FTP登陆密码</param>
/// <param name="errorMsg">返回错误消息</param>
/// <returns></returns>
private bool IsCanConnectFtp(string ftpServerFilePath, string ftpUserId, string ftpPwd, out string errorMsg)
{
bool flag = true;
FtpWebResponse ftpResponse = null;
FtpWebRequest ftpRequest = null;
errorMsg = string.Empty;
try
{
ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerFilePath));
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
ftpRequest.Timeout = 2 * 1000;//超时时间设置为2秒。
ftpRequest.Credentials = new NetworkCredential(ftpUserId, ftpPwd);
ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
}
catch (WebException exception)
{
ftpResponse = (FtpWebResponse)exception.Response;
switch (ftpResponse.StatusCode)
{
case FtpStatusCode.ActionNotTakenFileUnavailable:
errorMsg = "下载的文件不存在";
break;
case FtpStatusCode.ActionNotTakenFileUnavailableOrBusy:
errorMsg = "下载的文件正在使用,请稍后再试";
break;
default:
errorMsg = "发生未知错误";
break;
}
flag = false;
}
catch
{
errorMsg = "网络连接发生错误,请稍后再试";
flag = true;
}
finally
{
if (ftpResponse != null)
{
ftpResponse.Close();
}
}
return flag;
}
当 ftpServerFilePath 的路径为 “127.0.0.1\1.doc”, 这样进行传参时,就会抛异常,异常内容为无效的URi,如下图
解决方法
这是因为FtpWebRequest.Create
连接时不能识别'\' 这样的文件路径标识符,才会抛出上面的异常,因此传入的参数应该为”127.0.0.1/1.doc”。或者在方法里面进行替换。代码如下所示:
ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerFilePath.Replace("\\","/")));
这样就不会跑异常,至于能否连接或者文件是否存在,请自行查看连接
https://msdn.microsoft.com/zh-cn/library/system.net.ftpstatuscode(v=vs.110).aspx
或者自行 google FtpStatusCode 即可。
那么修改后的代码为:(关于C# 连接完整的FTP 可以仔细 google 查询,网上多的是,这样就不累述了)
/// <summary>
/// 测试是否可以成功连接FTP和判断文件是否存在
/// </summary>
/// <param name="ftpServerFilePath">FTP上文件地址</param>
/// <param name="ftpUserId">FTP登陆用户名</param>
/// <param name="ftpPwd">FTP登陆密码</param>
/// <param name="errorMsg">返回错误消息</param>
/// <returns></returns>
private bool IsCanConnectFtp(string ftpServerFilePath, string ftpUserId, string ftpPwd, out string errorMsg)
{
bool flag = true;
FtpWebResponse ftpResponse = null;
FtpWebRequest ftpRequest = null;
errorMsg = string.Empty;
try
{
ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerFilePath.Replace("\\","/")));
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
ftpRequest.Timeout = 2 * 1000;//超时时间设置为2秒。
ftpRequest.Credentials = new NetworkCredential(ftpUserId, ftpPwd);
ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
}
catch (WebException exception)
{
ftpResponse = (FtpWebResponse)exception.Response;
switch (ftpResponse.StatusCode)
{
case FtpStatusCode.ActionNotTakenFileUnavailable:
errorMsg = "下载的文件不存在";
break;
case FtpStatusCode.ActionNotTakenFileUnavailableOrBusy:
errorMsg = "下载的文件正在使用,请稍后再试";
break;
default:
errorMsg = "发生未知错误";
break;
}
flag = false;
}
catch
{
errorMsg = "网络连接发生错误,请稍后再试";
flag = true;
}
finally
{
if (ftpResponse != null)
{
ftpResponse.Close();
}
}
return flag;
}
来源:http://blog.csdn.net/u010533180/article/details/51697353
0
投稿
猜你喜欢
- 本文实例为大家分享了java实现滑动验证解锁的具体代码,供大家参考,具体内容如下1.html:<div class="dra
- 小程序获取手机号,后端JAVA解密流程代码微信官方文档获取手机号流程地址,先看下最好方便理解下面步骤实现思路,步骤如下1.前端需先调用官方w
- kaptcha是一个开源的验证码实现库1.添加依赖<dependency> <groupId>com.g
- 本文实例讲述了Java基于分治算法实现的棋盘覆盖问题。分享给大家供大家参考,具体如下:在一个2^k * 2^k个方格组成的棋盘中,有一个方格
- 在 Java 中,方法调用一般通过 Virtual Call 还有 Classic Call。Classic Call 就是直接指向方法的地
- 解释:二叉树的深度:从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。二叉树的宽度:二叉树的每一层中
- 目录一、有效的线程1. 如何使用后台线程以避免前台负载过荷?2.如何避免应用不响应ANR?3. 如何在分离的线程中初始化查询?4.其他二、设
- 这篇文章主要介绍了springboot配置文件绑定实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 简单介绍下功能1.每隔一段时间(比如1分钟)在京东手机每日一秒杀页面提取产品(手机)链接。 http://sale.360buy.com/a
- 昨天有个刚学java的师弟发了个程序给我,说死活编译不过,老是报编码问题,自己试了一下,也出问题了...当我们编辑了一个Java源文件保存时
- 常用的类:@ConditionalOnProperty(name = "use.redis.session.store"
- 样例代码在讲 Flutter 的盒子模型前,先看看HTML 中的盒子模型。如下图所示,一个页面元素包括了与父级容器的外边距(margin),
- 1介绍MVC框架是什么MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(control
- 先来回忆下在mybatis中的resultMap作用和是什么resultMap的作用是什么在使用传统的mybatis时,我们一般都会在xml
- #include<iostream>using namespace std;//非递归求解所有的子集void fun(int a
- 一、负载均衡负载均衡(Load Balance): 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞
- 相信大家对SaaS架构都有所了解,这里也不过多介绍,让我们直奔主题。技术框架springboot版本为2.3.4.RELEASE持久层采用J
- 序列化和反序列化的概念当我们在Java中创建对象的时候,对象会一直存在,直到程序终止时。但有时候可能存在一种"持久化"场
- 一.MyBatis简介1)MyBatis 是一款优秀的持久层框架2)MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结
- CyclicBarrier是什么CyclicBarrier是Java并发包中提供的一种同步工具类,它可以让多个线程在某个屏障处等待,直到所有