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

标签:C#,FtpWebRequest,FtpWebResponse,操作,FTP
0
投稿

猜你喜欢

  • java创建子类对象设置并调用父类的变量操作

    2023-10-13 18:16:13
  • java实现微信扫码登录第三方网站功能(原理和代码)

    2023-08-04 00:44:11
  • 逆转交替合并两个链表的解析与实现

    2021-12-31 12:37:41
  • mybatis的if判断integer问题

    2022-12-23 20:15:41
  • Java日期时间类(Date、DateFormat、Calendar)解析

    2022-08-06 18:02:14
  • SpringBoot使用Log4j过程详解

    2023-05-03 22:44:12
  • 浅析C# 9.0 新特性之 Lambda 弃元参数

    2022-05-08 16:28:22
  • SpringBoot异步调用方法并接收返回值

    2023-08-16 22:33:49
  • C++实现希尔排序(ShellSort)

    2022-03-03 22:29:13
  • C# 使用Fiddler捕获本地HttpClient发出的请求操作

    2022-06-28 04:10:34
  • c# 使用OpenCV识别硬币

    2021-12-18 15:09:13
  • 详解SpringMVC验证框架Validation特殊用法

    2023-06-08 22:23:29
  • Android 动画之TranslateAnimation应用详解

    2023-06-27 06:17:59
  • java数据结构算法稀疏数组示例详解

    2021-09-30 11:47:28
  • 使用Java反射模拟实现Spring的IoC容器的操作

    2023-06-03 17:37:42
  • 详细解读Hibernate的缓存机制

    2023-05-03 21:02:52
  • C# 设计模式系列教程-简单工厂模式

    2023-10-31 13:49:29
  • 基于socket和javaFX简单文件传输工具

    2022-11-04 12:37:42
  • Spring注解驱动开发实现属性赋值

    2023-05-07 04:40:22
  • Spring Boot 动态数据源示例(多数据源自动切换)

    2021-07-03 04:27:02
  • asp之家 软件编程 m.aspxhome.com