前段时间做了一个FTP操作服务器文件的实验,现在把一些经验写下来,免得忘记。

1、上传的处理:目标文件夹A上传到服务器指定目录。先检索服务器目录中有无同名文件夹,若有,则先改名,上传成功后再删除,上传失败则回复文件夹名。

1)、检查文件夹是否存在

        /// <summary>
/// 检查文件夹在服务器上是否已存在
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
private static bool CheckExist(string fileName)
{
FtpWebRequest checkRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(_upLoadPath));
checkRequest.Method = WebRequestMethods.Ftp.ListDirectory;
checkRequest.UseBinary = true;
checkRequest.Credentials = new NetworkCredential(_userName, _password);
FtpWebResponse response = (FtpWebResponse)checkRequest.GetResponse();
StreamReader sw = new StreamReader(response.GetResponseStream()); List<string> files = new List<string>();
string line = sw.ReadLine();
while (line != null)
{
files.Add(line.Substring(line.IndexOf("/") + ));
line = sw.ReadLine();
} sw.Close();
response.Close();
return files.Contains(fileName);
}

2)、文件夹的重命名

        /// <summary>
/// 文件夹重命名
/// </summary>
/// <param name="oldName"></param>
/// <param name="newName"></param>
private static void RenameFolder(string oldName, string newName)
{
string uri = _upLoadPath + "/" + oldName;
FtpWebRequest ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
ftpRequest.Method = WebRequestMethods.Ftp.Rename;
ftpRequest.UseBinary = true;
ftpRequest.Credentials = new NetworkCredential(_userName, _password);
ftpRequest.RenameTo = newName;
FtpWebResponse ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
ftpResponse.Close();
}

3)、文件夹的上传

        /// <summary>
/// 上传文件夹
/// </summary>
/// <param name="folderInfo">待上传文件夹的信息</param>
private static void UpLoadFolder(DirectoryInfo folderInfo)
{
// 服务器上文件夹的位置为根目录加上相对位置
// rootPath = (new DirectoryInfo(_localPath)).Parent.FullName; rootPath是待上传文件夹的目录
string foldePath = folderInfo.FullName.Substring(rootPath.Length).Replace('\\', '/');
string uriPath = _upLoadPath + "/" + foldePath;
// 创建文件夹
CreateFolder(uriPath);
// 递归创建子文件夹并上传文件
if (folderInfo != null)
{
foreach (DirectoryInfo folder in folderInfo.GetDirectories())
{
UpLoadFolder(folder);
}
foreach (FileInfo file in folderInfo.GetFiles())
{
UpLoadFile(file);
}
}
}
        /// <summary>
/// 创建文件夹
/// </summary>
/// <param name="folderPath">文件夹路径</param>
private static void CreateFolder(string folderPath)
{
FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(uriPath));
request.Method = WebRequestMethods.Ftp.MakeDirectory;
request.UseBinary = true;
request.Credentials = new NetworkCredential(_userName, _password);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream ftpStream = response.GetResponseStream();
ftpStream.Close();
response.Close();
}
        /// <summary>
/// 上传单个文件
/// </summary>
/// <param name="file"></param>
private static void UpLoadFile(FileInfo file)
{
// 服务器上文件的位置为根目录加上相对位置
string fileName = file.FullName.Substring(rootPath.Length).Replace('\\', '/');
string uriPath = _upLoadPath + "/" + fileName;
FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(uriPath));
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(_userName, _password); FtpWebResponse upLoadResponse = (FtpWebResponse)request.GetResponse();
Stream upLoadStream = request.GetRequestStream(); using (FileStream fileStream = File.Open(file.FullName, FileMode.Open))
{ byte[] buffer = new byte[];
int bytesRead;
while (true)
{
bytesRead = fileStream.Read(buffer, , buffer.Length);
if (bytesRead == )
break;
upLoadStream.Write(buffer, , bytesRead);
}
}
upLoadStream.Close();
upLoadResponse.Close();
}

4)、文件夹的删除

        /// <summary>
/// 删除文件夹及子文件和子文件夹
/// </summary>
/// <param name="folderName"></param>
private static void DeleteFolder(string folderName)
{
string uri = _upLoadPath + "/" + folderName;
FtpWebRequest searchRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
searchRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
searchRequest.Credentials = new NetworkCredential(_userName, _password);
FtpWebResponse searchResponse = (FtpWebResponse)searchRequest.GetResponse();
StreamReader sw = new StreamReader(searchResponse.GetResponseStream()); List<string> files = new List<string>();
List<string> folders = new List<string>();
string line = sw.ReadLine();
while (line != null)
{
// windows下的文件夹读取到的数据以“d”开头,以“空格” + 文件夹名 结束
if (line.StartsWith("d"))
folders.Add(line.Substring(line.LastIndexOf(" ") + ));
else
files.Add(line.Substring(line.LastIndexOf(" ") + ));
line = sw.ReadLine();
}
sw.Close();
searchResponse.Close(); // 递归删除服务器上的文件夹和文件
foreach (string folder in folders)
{
DeleteFolder(folderName + "/" + folder);
}
foreach (string file in files)
{
DeleteFile(folderName + "/" + file);
} FtpWebRequest deleteRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
deleteRequest.Method = WebRequestMethods.Ftp.RemoveDirectory;
deleteRequest.Credentials = new NetworkCredential(_userName, _password);
FtpWebResponse deleteResponse = (FtpWebResponse)deleteRequest.GetResponse();
deleteResponse.Close();
}
        /// <summary>
/// 删除单个文件
/// </summary>
/// <param name="fileName"></param>
private static void DeleteFile(string fileName)
{
string uri = _upLoadPath + "/" + fileName;
FtpWebRequest deleteRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
deleteRequest.Method = WebRequestMethods.Ftp.DeleteFile;
deleteRequest.Credentials = new NetworkCredential(_userName, _password);
FtpWebResponse deleteResponse = (FtpWebResponse)deleteRequest.GetResponse();
deleteResponse.Close();
}

至此,上传算是完成了。一些异常处理,配置文件的格式就不贴出来了。

2)、下载,一样是重命名,下载,删除的套路。但重命名和删除是在本地,很容易实现。而FTP下载的代码也与上传代码非常镜像,递归创建子文件夹和读取写文件就好了。

总结:对于ftp服务器上文件的任何操作

1.都需要用Uri(包含IP、端口号和目录的完整路径)去实例化一个FtpWebRequest对象。

2.用FtpWebRequest对象的Method属性来选择操作文件的方式,本文出现了ListDirectory(获取子文件夹信息)、Rename、MakeDirectory(创建文件夹)、UploadFile、ListDirectoryDetails(获取子文件夹及文件信息)、RemoveDirectory、DeleteFile以及文中没有出现但下载需用到的DownloadFile。

3.连接FTP服务器XXXXRequest.Credentials = new NetworkCredential(_userName, _password)

4.得到FTP的响应对象FtpWebResponse

5.如有必要,可获得响应对象FtpWebResponse的流GetRequestStream(),并进行读写操作。

可以看到FTP各种操作的相关代码非常类似,容易看懂,功能清晰。通过这次实验,接触了FTP服务器的搭建(FileZilla Server Interface工具一路点下一步。。。),学习了C#怎么实现FTP的上传下载,怎么用C#写windows服务以及如何调试(这个有时间、有闲心的话,也写一下,贡以后自己参考吧)。

C#的FTP上传下载的实验的更多相关文章

  1. JAVA 实现FTP上传下载(sun.net.ftp.FtpClient)

    package com.why.ftp; import java.io.DataInputStream; import java.io.File; import java.io.FileInputSt ...

  2. windows系统下ftp上传下载和一些常用命令

    先假设一个ftp地址 用户名 密码 FTP Server: home4u.at.china.com User: yepanghuang Password: abc123 打开windows的开始菜单, ...

  3. windows下ftp上传下载和一些常用命令

    先假设一个ftp地址 用户名 密码 FTP Server: home4u.at.china.com User: yepanghuang Password: abc123 打开windows的开始菜单, ...

  4. FTP上传下载工具(FlashFXP) v5.5.0 中文版

    软件名称: FTP上传下载工具(FlashFXP) 软件语言: 简体中文 授权方式: 免费试用 运行环境: Win 32位/64位 软件大小: 7.4MB 图片预览: 软件简介: FlashFXP 是 ...

  5. 高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)

    前言 最近在项目中需要和ftp服务器进行交互,在网上找了一下关于ftp上传下载的工具类,大致有两种. 第一种是单例模式的类. 第二种是另外定义一个Service,直接通过Service来实现ftp的上 ...

  6. C# -- FTP上传下载

    C# -- FTP上传下载 1. C#实现FTP下载 private static void TestFtpDownloadFile(string strFtpPath, string strFile ...

  7. Java.ftp上传下载

    1:jar的maven的引用: 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...

  8. python之实现ftp上传下载代码(含错误处理)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之实现ftp上传下载代码(含错误处理) #http://www.cnblogs.com/kait ...

  9. python之模块ftplib(实现ftp上传下载代码)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(实现ftp上传下载代码) #需求:实现ftp上传下载代码(不含错误处理) f ...

随机推荐

  1. js 计算过去和未来的时间距离现在多少天?

    计算传入的任意一时间.计算出这个时间距离现在还有多少天!或者计算过去的时间距离现在已经过去了多少天! 返回值有两种! 1.负值 代表过去了多少天 2.正值 代表距离设定的时间还有多少天 说明:距离设定 ...

  2. struts2 &lt;s: select 标签值

    JSP页面: <s:select label="家长导航"  value="id" name="navson.pid" list=&q ...

  3. 用css样式围剿等高列问题(转载)

    明修栈道暗度陈仓 该秘籍的心法只有十二个字:”隐藏容器溢出,正负内外边距.”看完下面的几行代码,再看这句话你真的可以看到圣光! 隐藏容器溢出.将外层容器的溢出设为隐藏: .container { ov ...

  4. 【转】 教你如何创建类似QQ的android弹出菜单

    原文地址:http://www.apkbus.com/android-18034-1-1.html 大家可能看到android的自带的系统菜单比较难看,如图: 2011-12-4 23:13 上传 下 ...

  5. Mock原理学习

    同事搓蛋问了我一个问题,mock的原理是啥,没怎么想出来,于是花了点时间学习了一下. 从Moq这个库入手:https://github.com/moq/moq4 Moq用到了Castle的库用于Dyn ...

  6. MVC应用程序实现文件库(FlexPaper)

    MVC应用程序实现文件库(FlexPaper) 很久之前Insus.NET在实现了<FlexPaper实现文档在线浏览>http://www.cnblogs.com/insus/archi ...

  7. C#中另辟蹊径解决JSON / XML互转的问题

    C#中另辟蹊径解决JSON / XML互转的问题 最近在一个POC的项目中要用到JSON和XML的相互转换, 虽然我知道很多类库如JSON.NET具备这种功能, 但是我还是另辟蹊径的使用Spider ...

  8. Indenting source code

    Artistic Style 1.15.3 A Free , Fast and Small Automatic Formatterfor C , C++ , C# , Java Source Code ...

  9. HDU1423:Greatest Common Increasing Subsequence(LICS)

    Problem Description This is a problem from ZOJ 2432.To make it easyer,you just need output the lengt ...

  10. 企业架构研究总结(45)——企业架构与建模之使用ArchiMate进行分析(全系列完)

    4. 使用ArchiMate进行分析 正如前面所说的那样,一个企业整体效率的提升有时并不是通过某一个领域内的优化就能达到的,而且这种忽视全局的做法往往还会造成不必要的浪费.由此可见,一个能够跨越各个领 ...