C#实现不同ftp服务器间文件(夹)同步

图1 实现不同ftp服务器间文件(夹)同步的实现思路图

    /// <summary>
/// 将文件夹1从ftp服务器1移到ftp服务器2文件夹2
/// </summary>
/// <param name="sFtpUriD">源ftp url:ftp://ip+port</param>
/// <param name="sFilePathD">源ftp 文件路径:/xxx/xxx/xxx</param>
/// <param name="sFtpUserD">源ftp用户名</param>
/// <param name="sFtpPwdD">源ftp密码</param>
/// <param name="sFtpUriU">目的ftp url:ftp://ip+port</param>
/// <param name="sFilePathU">目的ftp 文件路径:/xxx/xxx/xxx</param>
/// <param name="sFtpUserU">目的ftp用户名</param>
/// <param name="sFtpPwdU">目的ftp密码</param>
/// <returns></returns>
public bool MoveFolderOnDiffFtp(string sFtpUriD, string sFolderPathD, string sFtpUserD, string sFtpPwdD,
string sFtpUriU, string sFolderPathU, string sFtpUserU, string sFtpPwdU)
{
//获取文件夹中的详细文件列表信息(包括文件大小信息)
string[] sFileNameArr = GetFileList(sFtpUriD + sFolderPathD, WebRequestMethods.Ftp.ListDirectoryDetails, sFtpUserD, sFtpPwdD);
//判断是否为单个文件
if (sFileNameArr.Length <= ) //文件夹中存在单文件
{
//在ftp服务器2上创建文件夹
FtpCheckDirectoryExist(sFtpUriU + "/", sFolderPathU + "/", sFtpUserU, sFtpPwdU);
if (sFileNameArr[sFileNameArr.Length - ] == "")
{
string[] onlyname = GetFileList(sFtpUriD + sFolderPathD, WebRequestMethods.Ftp.ListDirectory, sFtpUserD, sFtpPwdD);
foreach (string onlynames in onlyname)
{
if (onlynames == "" || onlynames == " ")
{
break;
}
else
{
MoveFileOnDiffFtp(sFtpUriD, sFolderPathD + "/" + onlynames, sFtpUserD, sFtpPwdD,
sFtpUriU, sFolderPathU + "/" + onlynames, sFtpUserU, sFtpPwdU);
break;
}
}
}
}
else //文件夹中存在多文件或子文件夹
{
//在ftp服务器2上创建文件夹
FtpCheckDirectoryExist(sFtpUriU + "/", sFolderPathU + "/", sFtpUserU, sFtpPwdU);
foreach (string sFileName in sFileNameArr)
{
//判断是否具有文件夹标识<DIR>
if (sFileName.Contains("<DIR>"))
{
string sInnerFloder = sFileName.Split(new string[] { "<DIR>" }, StringSplitOptions.None)[].Trim();
MoveFolderOnDiffFtp(sFtpUriD, sFolderPathD + "/" + sInnerFloder, sFtpUserD, sFtpPwdD,
sFtpUriU, sFolderPathU + "/" + sInnerFloder, sFtpUserU, sFtpPwdU); //递归文件夹中的子文件夹
}
else
{
string[] onlyname = GetFileList(sFtpUriD + sFolderPathD, WebRequestMethods.Ftp.ListDirectory, sFtpUserD, sFtpPwdD);
foreach (string onlynames in onlyname)
{
if (onlynames == "" || onlynames == " " || sFileName == "")
{
break;
}
else
{
if (sFileName.Contains(" " + onlynames))
{
MoveFileOnDiffFtp(sFtpUriD, sFolderPathD + "/" + onlynames, sFtpUserD, sFtpPwdD,
sFtpUriU, sFolderPathU + "/" + onlynames, sFtpUserU, sFtpPwdU);
break;
}
}
}
}
}
}
return true;
}
/// <summary>
/// 将文件从ftp服务器1移到ftp服务器2文件
/// </summary>
/// <param name="sFtpUriD">源ftp url:ftp://ip+port</param>
/// <param name="sFilePathD">源ftp 文件路径:/xxx/xxx/xxx</param>
/// <param name="sFtpUserD">源ftp用户名</param>
/// <param name="sFtpPwdD">源ftp密码</param>
/// <param name="sFtpUriU">目的ftp url:ftp://ip+port</param>
/// <param name="sFilePathU">目的ftp 文件路径:/xxx/xxx/xxx</param>
/// <param name="sFtpUserU">目的ftp用户名</param>
/// <param name="sFtpPwdU">目的ftp密码</param>
/// <returns></returns>
public bool MoveFileOnDiffFtp(string sFtpUriD, string sFilePathD, string sFtpUserD, string sFtpPwdD,
string sFtpUriU, string sFilePathU, string sFtpUserU, string sFtpPwdU)
{
try
{
//在目的ftp服务器上创建文件夹
string sFolderPathU = sFilePathU.Substring(, sFilePathU.LastIndexOf("/"));
FtpCheckDirectoryExist(sFtpUriU + "/", sFolderPathU + "/", sFtpUserU, sFtpPwdU);
//1.从源ftp服务器1下载
FtpWebRequest reqFtpDownload;
reqFtpDownload = (FtpWebRequest)FtpWebRequest.Create(new Uri(sFtpUriD + sFilePathD));
reqFtpDownload.Credentials = new NetworkCredential(sFtpUserD, sFtpPwdD);
reqFtpDownload.Method = WebRequestMethods.Ftp.DownloadFile; //下载方法
reqFtpDownload.KeepAlive = false;
reqFtpDownload.UseBinary = true;
reqFtpDownload.Proxy = null;
FtpWebResponse response = (FtpWebResponse)reqFtpDownload.GetResponse();
//将从服务器1下载的响应流直接作为上传到服务器2的上传流
Stream stream = response.GetResponseStream();
//2.上传到目的ftp服务器2
FtpWebRequest reqFTPUpload;
reqFTPUpload = (FtpWebRequest)FtpWebRequest.Create(new Uri(sFtpUriU + sFilePathU));
reqFTPUpload.Credentials = new NetworkCredential(sFtpUserU, sFtpPwdU);
reqFTPUpload.Method = WebRequestMethods.Ftp.UploadFile; //上传方法
reqFTPUpload.KeepAlive = false;
reqFTPUpload.UseBinary = true;
reqFTPUpload.Proxy = null;
int buffLength = ; //每次读入文件流2kb
byte[] buff = new byte[buffLength];
Stream requestStream = reqFTPUpload.GetRequestStream();
int len = stream.Read(buff, , buff.Length); //文件大小
while (len > )
{
requestStream.Write(buff, , len);
len = stream.Read(buff, , buffLength);
}
stream.Close();
requestStream.Close();
stream.Dispose();//释放资源
requestStream.Dispose();//释放资源return true;
}
catch (Exception ex)
{
         return false;
}
}
/// <summary>
/// 获取ftp上文件夹中的文件(夹)列表信息
/// </summary>
/// <param name="sFloderPath">ftp路径</param>
/// <param name="type">获取列表的类型(详细或只有文件名)</param>
/// <param name="sFtpUser">ftp用户名</param>
/// <param name="sFtpPwd">ftp密码</param>
/// <returns></returns>
private string[] GetFileList(string sFloderPath, string type ,string sFtpUser,string sFtpPwd)
{
WebResponse webresp = null;
StreamReader ftpFileListReader = null;
FtpWebRequest ftpRequest = null;
StringBuilder str = new StringBuilder();
try
{
ftpRequest = (FtpWebRequest)WebRequest.Create(new Uri(sFloderPath));
ftpRequest.Credentials = new NetworkCredential(sFtpUser, sFtpPwd);
ftpRequest.Method = type;
webresp = ftpRequest.GetResponse();
ftpFileListReader = new StreamReader(webresp.GetResponseStream(), Encoding.UTF8);
string line = ftpFileListReader.ReadLine();
while (line != null)
{
str.Append(line);
str.Append("/n");
line = ftpFileListReader.ReadLine();
}
}
catch (Exception ex)
{}
return str.ToString().Split(new string[] { "/n" }, StringSplitOptions.None);
}
/// <summary>
/// 判断文件的目录是否存,不存则创建
/// </summary>
/// <param name="destFilePath"></param>
private static void FtpCheckDirectoryExist(string strFtpURI, string destFilePath, string strFtpUserID, string strFtpPassword)
{
string fullDir = destFilePath.Substring(, destFilePath.LastIndexOf("/"));
string[] dirs = fullDir.Split('/');
string curDir = "";
for (int i = ; i < dirs.Length; i++)
{
string dir = dirs[i];
//如果是以/开始的路径,第一个为空
if (dir != null && dir.Length > )
{
try
{
curDir += dir + "/";
FtpMakeDir(strFtpURI, curDir, strFtpUserID, strFtpPassword);
}
catch (Exception)
{}
}
}
}
/// <summary>
/// 创建ftp目录
/// </summary>
private static Boolean FtpMakeDir(string strFtpURI, string destFilePath, string strFtpUserID, string strFtpPassword)
{
FtpWebRequest req = (FtpWebRequest)WebRequest.Create(strFtpURI + destFilePath);
req.Credentials = new NetworkCredential(strFtpUserID, strFtpPassword);
req.Proxy = null;
req.KeepAlive = false;
req.Method = WebRequestMethods.Ftp.MakeDirectory;//请求方法为创建目录方法
req.UseBinary = true;
FtpWebResponse response = req.GetResponse() as FtpWebResponse;
Stream ftpStream = response.GetResponseStream();
ftpStream.Close();
response.Close();
req.Abort();
return true;
}

......

C# 实现文件(夹)在ftp服务器间的同步【无需将文件(夹)保存到本地】的更多相关文章

  1. Win7 自带FTP将文件复制到FTP服务器时发生错误。

    错误截图: 错误信息: 将文件复制到FTP服务器时发生错误.请检查是否有权限将文件放到该服务器上. 详细信息: 200 Type set to I. 200 PORT commad successfu ...

  2. 检验指定路径的文件是否存在ftp服务器中

    import org.apache.commons.net.ftp.FTP;import org.apache.commons.net.ftp.FTPClient;import org.apache. ...

  3. [转]实用教程:搭建FTP服务器以实现局域网飞速传输文件

    原文地址:https://www.ithome.com/html/win10/304059.htm 相信很多人都面临过这样的问题:一个局域网下有很多设备,我们想在这些设备之间互传文件,有些文件非常大, ...

  4. Android和FTP服务器交互,上传下载文件(实例demo)

    今天同学说他备份了联系人的数据放在一个文件里,想把它存到服务器上,以便之后可以进行下载恢复..于是帮他写了个上传,下载文件的demo 主要是 跟FTP服务器打交道-因为这个东东有免费的可以身亲哈 1. ...

  5. Linux小工具:文件上传ftp服务器

    工作期间,每次将文件上传至ftp服务器时,均需要手工输入ip.用户名.密码等,因此,考虑编写脚本完成文件的上传任务.具体的脚本sync.sh如下: #!/bin/bash source ~/.bash ...

  6. Linux 常用命令 服务器间scp 用户 export 创建文件、软连接

    获取外网ip curl icanhazip.com 服务器间的 文件 复制 scp root@ip:/源目录 目标目录 软连接 查看软连接 ls -li 创建软连接 ln -s 源文件 目标文件 -s ...

  7. CentOS6.5下搭建ftp服务器(三种认证模式:匿名用户、本地用户、虚拟用户)

    CentOS 6.5下搭建ftp服务器 vsftpd(very secure ftp daemon,非常安全的FTP守护进程)是一款运行在Linux操作系统上的FTP服务程序,不仅完全开源而且免费,此 ...

  8. 使用rsync实现不同Linux服务器间目录同步

    实现目标:    A 服务器上 /opt/web 目录,与B服务器上 /opt/web目录实现同步.即:B主动与A进行同步.   OS: Reaht AS4   A Server  192.168.1 ...

  9. c#之向ftp服务器传文件

    .Net提供了FtpWebRequest类,代码如下: using System; using System.Collections.Generic; using System.IO; using S ...

随机推荐

  1. poj2010

    大学招n(n为奇数)个牛 招第i个牛需要ai块钱 第i个牛高考si分 输入招的牛数n 总的牛数c 总的钱数f 以及ai si 问用这些钱招的n个牛高考分数的中位数最大是多少 如果钱不够输出-1 这题结 ...

  2. 【scrapy实践】_爬取安居客_广州_新楼盘数据

    需求:爬取[安居客—广州—新楼盘]的数据,具体到每个楼盘的详情页的若干字段. 难点:楼盘类型各式各样:住宅 别墅 商住 商铺 写字楼,不同楼盘字段的名称不一样.然后同一种类型,比如住宅,又分为不同的情 ...

  3. Phone numbers

    Phone number in Berland is a sequence of n digits. Often, to make it easier to memorize the number, ...

  4. ACM学习历程—SNNUOJ1214 矩阵1(二分)

    题目链接:http://219.244.176.199/JudgeOnline/problem.php?id=1214 这是这次微软实习面试的一道题,题目大意就是:有一个n*m的矩阵,已知它每一行都是 ...

  5. jsp有哪些内置对象?作用分别是什么?

    JSP共有以下9种基本内置组件 1.request对象 客户端请求,此请求会包含来自GET/POST请求的参数通过它才能了解到客户的需求,然后做出响应. 2.response对象 响应客户请求的有关信 ...

  6. XXXAction-validation.xml文件中报错:Referenced file Contains errors

    我们需要引用与验证器配置相关的dtd文件,这个文件可以在xwork-core-2.3.1.2.jar下找到(xwork-validator-1.0.3.dtd) 网上有很多处理办法,如下所示: 1.直 ...

  7. c# pictureBox 循环播放图片

    c# 1.遍历目录 查找图片 2.在 pictureBox 循环播放 public void PlayThread()//CMD_UpdateBtnStatus cmd { Int32 framera ...

  8. 侯捷STL学习(一)--顺序容器测试

    开始跟着<STL源码剖析>的作者侯捷真人视频,学习STL,了解STL背后的真实故事! 视频链接:侯捷STL 还有很大其他视频需要的留言 第一节:STL版本和重要资源 STL和标准库的区别 ...

  9. Python类(七)-类的特殊成员方法

    __doc__ 用来表示类的描述信息 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" class Person(object) ...

  10. Ubuntu中vi命令的使用

    指今说明: 进入 vi 的命令vi filename: 打开或新建文件,并将光标置于第一行首 vi +n filename: 打开文件,并将光标置于第n行首 vi + filename: 打开文件,并 ...