C#使用FtpWebRequest与FtpWebResponse完成FTP操作
作者:springsnow 发布时间:2021-08-24 04:58:26
一、WebRequestMethods.Ftp类:
表示可与 FTP 请求一起使用的 FTP 协议方法的类型。
AppendFile:表示要用于将文件追加到 FTP 服务器上的现有文件的 FTP APPE 协议方法。
DeleteFile:表示要用于删除 FTP 服务器上的文件的 FTP DELE 协议方法。
DownloadFile:表示要用于从 FTP 服务器下载文件的 FTP RETR 协议方法。
GetDateTimestamp:表示要用于从 FTP 服务器上的文件检索日期时间戳的 FTP MDTM 协议方法。
GetFileSize:表示要用于检索 FTP 服务器上的文件大小的 FTP SIZE 协议方法。
ListDirectory:表示获取 FTP 服务器上的文件的简短列表的 FTP NLIST 协议方法。
ListDirectoryDetails:表示获取 FTP 服务器上的文件的详细列表的 FTP LIST 协议方法。
MakeDirectory:表示在 FTP 服务器上创建目录的 FTP MKD 协议方法。
PrintWorkingDirectory:表示打印当前工作目录的名称的 FTP PWD 协议方法。
RemoveDirectory:表示移除目录的 FTP RMD 协议方法。
Rename:表示重命名目录的 FTP RENAME 协议方法。
UploadFile:表示将文件上载到 FTP 服务器的 FTP STOR 协议方法。
UploadFileWithUniqueName:表示将具有唯一名称的文件上载到 FTP 服务器的 FTP STOU 协议方法。
二、上传文件:
OpenFileDialog opFilDlg = new OpenFileDialog();
if (opFilDlg.ShowDialog() == DialogResult.OK)
{ ftp = new YBBFTPClass("hz.a.cn", "", "csp", "welcome", 0);
ftp.UploadFile(opFilDlg.FileName);
MessageBox.Show("上传成功");
}
/// <summary>
/// 文件上传
/// </summary>
/// <param name="filename">本地文件路径</param>
public void UploadFile(string filename)
{
FileInfo fileInf = new FileInfo(filename);
string uri = "ftp://" + RemoteHost + "/" + fileInf.Name;
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + RemoteHost + "/" + fileInf.Name));// 根据uri创建FtpWebRequest对象
reqFTP.Credentials = new NetworkCredential(RemoteUser, RemotePass); // ftp用户名和密码
reqFTP.KeepAlive = false; // 默认为true,连接不会被关闭, 在一个命令之后被执行
reqFTP.Method = WebRequestMethods.Ftp.UploadFile; // 指定执行什么命令
reqFTP.UseBinary = true; // 指定数据传输类型
reqFTP.ContentLength = fileInf.Length; // 上传文件时通知服务器文件的大小
int contentLen;
FileStream fileStream = fileInf.OpenRead(); // 打开一个文件读取内容到fileStream中
contentLen = fileStream.Read(buffer, 0, buffer.Length); ;//从fileStream读取数据到buffer中
Stream requestStream = reqFTP.GetRequestStream();
// 流内容没有结束
while (contentLen != 0)
{
requestStream.Write(buffer, 0, contentLen);// 把内容从buffer 写入 requestStream中,完成上传。
contentLen = fileStream.Read(buffer, 0, buffer.Length);
}
// 关闭两个流
requestStream.Close();
//uploadResponse = (FtpWebResponse)reqFTP.GetResponse();
fileStream.Close();
}
三、下载文件
1、核心代码
/// <summary>
/// 下载文件
/// </summary>
/// <param name="filePath">本地目录</param>
/// <param name="fileName">远程路径</param>
public void DownloadFile(string filePath, string fileName)
{
FtpWebRequest reqFTP;
try
{
FileStream fileStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + RemoteHost + "/" + fileName));
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(RemoteUser, RemotePass);
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream responseStream = response.GetResponseStream();//从ftp响应中获得响应流
//long cl = response.ContentLength;
byte[] buffer = new byte[1024];
int readCount;
readCount = responseStream.Read(buffer, 0, buffer.Length);//从ftp的responseStream读取数据到buffer中
while (readCount > 0)
{
fileStream.Write(buffer, 0, readCount);//从buffer读取数据到fileStream中,完成下载
readCount = responseStream.Read(buffer, 0, buffer.Length);
}
responseStream.Close();
fileStream.Close();
response.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
2、winform:
FolderBrowserDialog fldDlg = new FolderBrowserDialog();
if (txtUpload.Text.Trim().Length > 0)
{
if (fldDlg.ShowDialog() == DialogResult.OK)
{
ftp.DownloadFile(fldDlg.SelectedPath, txtUpload.Text.Trim());
MessageBox.Show("下载成功");
}
}
else
{
MessageBox.Show("Please enter the File name to download");
}
3、webform弹出下载提示:
FtpClient _client = new FtpClient();
Stream stream = _client.OpenRead(FtpFilePath, FtpDataType.Binary);
string FtpFilePath = Request.QueryString["FilePath"];
string _fname = Path.GetFileName(FtpFilePath);
Response.ContentType = "application/" + _fname.Split('.')[1];
Response.AddHeader("Content-disposition", "attachment; filename=" + _fname);
byte[] buffer = new byte[10240];
int readCount;
do
{
readCount = stream.Read(buffer, 0, buffer.Length);
Response.OutputStream.Write(buffer, 0, readCount);//持续写入流
} while (readCount != 0);
Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.End();
四、删除文件
string uri = "ftp://" + RemoteHost + "/" + fileName;
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + RemoteHost + "/" + fileName));
reqFTP.Credentials = new NetworkCredential(RemoteUser, RemotePass);
reqFTP.KeepAlive = false;
reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;
string result = String.Empty;
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
long size = response.ContentLength;
Stream datastream = response.GetResponseStream();
StreamReader sr = new StreamReader(datastream);
result = sr.ReadToEnd();
sr.Close();
datastream.Close();
response.Close();
完整代码参考:
https://www.jb51.net/article/119779.htm
来源:https://www.cnblogs.com/springsnow/p/10149161.html


猜你喜欢
- 目录 - JWT- JWT与其它的区别OAuthCookie/Session Auth- JWT的优点- 认证- JWT的缺点-
- 同步是一种只允许一个线程在特定时间访问某些资源的技术。没有其他线程可以中断,直到所分配的线程或当前访问线程访问数据完成其任务。在多线程程序中
- 最近我尝试使用ViewPager+GridView实现的,看起来一切正常,废话不多说,具体代码如下:如图是效果图 首先分析下思路1
- 学习spring依赖注入的时候碰到这个坑,折腾了许久,记录一下以防其他小伙伴入坑!该异常主要原因是因为JDK与Spring版本不一致。要么更
- 老风格,废话不多说了,直接给大家贴java代码了。代码如下:package com.zzw.getPhoneInfos;import and
- 项目地址:gitee.com/baojh123/rp…netty-study 这个项目是没用到的,可以删掉,主要是测试
- 前言:现在一般的Android软件都是需要不断更新的,当你打开某个app的时候,如果有新的版本,它会提示你有新版本需要更新。该项目实现的就是
- 背景在开发需求当中,当有总收益、总用户数等数字要显示时,为了更好的给用户提供展示效果,往往会想加入炫酷的数字滚动动画,使呆板平静的数字变得灵
- 重新认识 Java 的 System.in以前也写过不少命令行的程序,处理文件时总需要通过参数指定路径,直到今天看资料时发现了一种我自己从来
- 问题在本地启动dubbo时,服务注册在本地的zookeeper ,但是注册IP却不是本地的iP。产生问题,导致consumer 找不到pro
- 需要的jar包:数据库代码:create database school character set utf8;use school;CRE
- 题目要求思路一:暴力模拟由于数据范围不算离谱,所以直接遍历解决可行。Javaclass Solution { pu
- Android自定义View实现APP启动页倒计时效果,供大家参考,具体内容如下之前也是做过APP启动页的倒计时效果,但是只有文字变化,没有
- 本文实例讲述了Android开发圆角Button按钮实现过程,分享给大家供大家参考,具体内容如下需求及效果图:实现思路:1、shape实现圆
- 仿QQ侧滑删除效果图1.自定义listviewpublic class DragDelListView extends ListView {
- 需要5个类:1.实体类:Person.java2.抽象类:SQLOperate.java(封装了对数据库的操作)3.助手类:DBOpenHe
- 实践过程效果代码public partial class Form1 : Form{ private HookEx
- 废话不多说,上代码String basePath = request.getScheme()+"://"+request
- RTF文档即富文本格式(Rich Text Format)的文档。我们在处理文件时,遇到需要对文档格式进行转换时,可以将RTF转为其他格式,
- 一个比较常见的改进用户体验的方案是用Redo/Undo来取代确认对话框,由于这个功能比较常用,本文简单的给了一个在C#中通过Command模