Ftp实现文件同步
通常在做服务器与服务器文件、服务器与本地文件同步时通过Ftp服务实现,下面就以服务器文件和本地同步为例,介绍一下Ftp同步文件:
首先建立一个Ftp站点服务,基本身份验证登陆,端口号为默认的21;
Ftp文件同步前端界面如下:
Ftp文件同步后台实现
#region 获取Ftp服务端文件比较替换
/// <summary>
/// 比较替换
/// </summary>
private void btnQuery_Click(object sender, EventArgs e)
{
msg.AppendText(Environment.NewLine + "开始连接...");
FtpHelp fw = new FtpHelp(service.Text.Trim(), "", lognName.Text.Trim(), Pwd.Text.Trim());
if (fw.ISOK())
{
msg.AppendText(Environment.NewLine + "连接成功!\r\n");
Replace(service.Text.Trim(), hostAdress.Text.Trim());
}
else
{
msg.AppendText(Environment.NewLine + "连接失败!\r\n");
}
}
private bool _isOver = false;
private void Replace(string ftpAdress, string hostAdress)
{
if (!_isOver)
{
_isOver = true;
//链接ftp服务
FtpHelp ftphelp = new FtpHelp(service.Text.Trim(), "", lognName.Text.Trim(), Pwd.Text.Trim());
//获取本地文件
LogHostFile[] hostFile = GetFile(hostAdress);
LogWriter.LogInfo("获取本地文件完成共:" + hostFile.Count());
//获取FTP服务器文件
DateTime begin = DateTime.Now;
FtpFile[] files = ftphelp.GetFilesList("ftp://" + ftpAdress.Trim(), "");
DateTime end = DateTime.Now;
time.Text = "获取服务文件用时:" + (end - begin).Milliseconds.ToString() + "ms;共" + files.Count() + "个文件";
if (files.Count() == )
{
LogWriter.LogInfo("获取服务器文件完成共:" + files.Count() + "可能是服务器连接失败或真的没有文件请管理员查看");
}
else
{
LogWriter.LogInfo("获取服务器文件完成共:" + files.Count());
}
Dictionary host = new Dictionary();
Dictionary ftp = new Dictionary();
if (hostAdress == "")
{
LogWriter.LogError("本地路径为空");
}
else
{
try
{
//遍历Ftp服务器端的文件
ftp.Clear();
foreach (FtpFile ftpfile in files)
{
if (!ftp.ContainsKey(ftpfile.FileFullName))
{
ftp.Add(ftpfile.FileFullName, ftpfile.FileSize);
}
}
//遍历本地服务器端的文件
host.Clear();
foreach (LogHostFile ftpfile in hostFile)
{
if (!host.ContainsKey(ftpfile.FileFullName))
{
host.Add(ftpfile.FileFullName, ftpfile.FileSize);
}
}
}
catch (Exception ex)
{
LogWriter.LogError("将本地和服务文件放入Dictionary集合中出错:" + ex.Message);
}
finally
{
_isOver = false;
}
LogWriter.LogInfo("开始循环服务器中的文件比较替换");
bool IsRelpace = false;
foreach (KeyValuePair ftpfile in ftp)
{
#region 判断服务器端的文件是否在本地存在
//判断服务器端的文件是否在本地存在
if (host.Count != )//如果本地没有文件
{
#region 是否有这个文件
if (host.ContainsKey(ftpfile.Key))
{
#region 如果存在判断两个文件的大小是否相等
//如果存在判断两个文件的大小是否相等
if (host[ftpfile.Key] != ftpfile.Value)
{
IsRelpace = true;
LogWriter.LogInfo(ftpfile.Key + " 文件在本地的大小:" + host[ftpfile.Key] + ";在服务器的大小:" + ftpfile.Value);
//不相等就等换
try
{
if (ftphelp.Download(hostAdress, ftpfile.Key.Trim()))
{
msg.AppendText(Environment.NewLine + "开始替换" + "ftp://" + ftpAdress.Trim() + "/" + ftpfile.Key + "\r\n");
msg.AppendText(Environment.NewLine + "替换中..." + "\r\n");
msg.AppendText(Environment.NewLine + "替换成功!" + "\r\n");
LogWriter.LogInfo("替换文件:" + ftpfile.Key.Trim() + "本地文件大小:" + host[ftpfile.Key] + "; FTP文件大小:" + ftpfile.Value);
}
else
{
msg.AppendText(Environment.NewLine + "替换失败!" + "\r\n");
LogWriter.LogError("替换文件:" + ftpfile.Key.Trim() + "失败");
}
}
catch (Exception ex)
{
LogWriter.LogError("文件" + ftpfile.Key + "比较替换时失败:" + ex.Message);
}
finally
{
_isOver = false;
}
}
#endregion
}
else
{
IsRelpace = true;
try
{
if (ftphelp.Download(hostAdress, ftpfile.Key.Trim()))
{
msg.AppendText(Environment.NewLine + "本地没有的文件开始下载" + "ftp://" + ftpAdress.Trim() + "/" + ftpfile.Key);
msg.AppendText(Environment.NewLine + "下载中...");
msg.AppendText(Environment.NewLine + "下载成功!");
LogWriter.LogInfo("下载服务器文件" + ftpfile.Key.Trim());
}
else
{
msg.AppendText(Environment.NewLine + "下载新文件失败!");
LogWriter.LogError("下载服务器文件" + ftpfile.Key.Trim() + "失败");
}
}
catch (Exception ex)
{
LogWriter.LogError("文件" + ftpfile.Key + "下载时失败:" + ex.Message);
}
finally
{
_isOver = false;
}
}
#endregion
}
else
{
IsRelpace = true;
try
{
if (ftphelp.Download(hostAdress, ftpfile.Key.Trim()))
{
msg.AppendText(Environment.NewLine + "本地没有的文件开始下载" + "ftp://" + ftpAdress.Trim() + "/" + ftpfile.Key);
msg.AppendText(Environment.NewLine + "下载中...");
msg.AppendText(Environment.NewLine + "下载成功!");
LogWriter.LogInfo("下载服务器文件" + ftpfile.Key.Trim());
}
else
{
msg.AppendText(Environment.NewLine + "下载新文件失败!");
LogWriter.LogError("下载服务器文件" + ftpfile.Key.Trim() + "失败");
}
}
catch (Exception ex)
{
LogWriter.LogError("文件" + ftpfile.Key + "下载时失败:" + ex.Message);
}
finally
{
_isOver = false;
}
}
#endregion
}
if (IsRelpace)
{
LogWriter.LogInfo("替换工作完成!!");
}
else
{
LogWriter.LogInfo("FTP和本地的文件没有不同不需要替换");
}
}
}
else
{
LogWriter.LogInfo("上一次替换未执行完成不进行下一次的操作!");
}
}
#endregion
#region 获取本地文件
public LogHostFile[] GetFile(string str)
{
List hostFile = new List();
if (str != "")
{
string filepath = hostAdress.Text.Trim();
DirectoryInfo theFolder = new DirectoryInfo(str);
//LogWriter.LogInfo(str);
FileSystemInfo[] fileinfo = theFolder.GetFileSystemInfos();
foreach (FileSystemInfo NextFolder in fileinfo)
{
if (this.GetFileType(NextFolder.FullName) == )//wenjian
{
FileInfo Next = (FileInfo)NextFolder;
long size = Next.Length;
//获取文件的名称
hostFile.Add(new LogHostFile() { FileSize = size, FileFullName = NextFolder.FullName.Replace("\\", "/").Remove(, filepath.Length).Substring() });
LogWriter.LogInfo(NextFolder.FullName);
}
else if (this.GetFileType(NextFolder.FullName) == )//wenjianjia
{
LogHostFile[] hostfile = GetFile(NextFolder.FullName);
foreach (LogHostFile file in hostfile)
{
hostFile.Add(file);
}
}
}
}
else
{
LogWriter.LogError("没有给本地文件路径!");
}
return hostFile.ToArray();
}
#endregion
/// <summary>
/// 判断是文件还是文件夹
/// </summary>
public int GetFileType(string path)
{
if (File.Exists(path))
{
return ;
// 是文件
}
else if (Directory.Exists(path))
{
return ;
// 是文件夹
}
else
{
return ;
// 都不是
}
}
Ftp操作帮助类
public class FtpHelp
{
string ftpServerIP;
string ftpRemotePath;
string ftpUserName;
string ftpPassword;
string ftpURI;
#region 连接FTP
/// <summary>
/// 连接FTP
/// </summary>
/// FTP连接地址
/// 指定FTP连接成功后的当前目录, 如果不指定即默认为根目录
/// 用户名
/// 密码
public FtpHelp(string FtpServerIP, string FtpRemotePath, string FtpUserName, string FtpPassword)
{
ftpServerIP = FtpServerIP;
ftpRemotePath = FtpRemotePath;
ftpUserName = FtpUserName;
ftpPassword = FtpPassword;
ftpURI = "ftp://" + ftpServerIP + "/";
}
/// <summary>
/// 是否连接成功
/// </summary>
public bool ISOK()
{
try
{
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
reqFTP.Credentials = new NetworkCredential(ftpUserName, ftpPassword);
return true;
}catch(Exception e)
{
return false;
}
}
#endregion
#region 下载
/// <summary>
/// 下载
/// </summary>
public bool Download(string filePath, string fileName)
{
FtpWebRequest reqFTP;
try
{
string newpath="";
if (fileName.Contains("/"))
{
newpath=fileName.Substring(,fileName.LastIndexOf(@"/"));
newpath = newpath.Replace("/", "\\");
}
string path = filePath+"\\" + newpath;
DirectoryInfo di = new DirectoryInfo(path);
if (!di.Exists)
{
di.Create();
}
FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileName));
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUserName, ftpPassword);
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
long cl = response.ContentLength;
int bufferSize = ;
int readCount;
byte[] buffer = new byte[bufferSize];
readCount = ftpStream.Read(buffer, , bufferSize);
while (readCount > )
{
outputStream.Write(buffer, , readCount);
readCount = ftpStream.Read(buffer, , bufferSize);
}
ftpStream.Close();
outputStream.Close();
response.Close();
return true;
}
catch (Exception ex)
{
LogWriter.LogError("文件" + fileName + "下载失败:" + ex.Message);
// Insert_Standard_ErrorLog.Insert("FtpWeb", "Download Error --> " + ex.Message);
return false;
}
}
#endregion
#region 获取当前目录下明细(包含文件和文件夹)
string name = "";
public FtpFile[] GetFilesList(string ftpURI,string name)
{
List result = new List();
try
{
FtpWebRequest ftp;
Uri uri = new Uri(ftpURI);
LogWriter.LogInfo(uri.Host);
LogWriter.LogInfo(uri.HostNameType.ToString());
LogWriter.LogInfo(uri.IsFile.ToString());
LogWriter.LogInfo(uri.LocalPath);
ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
ftp.Credentials = new NetworkCredential(ftpUserName, ftpPassword);
ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
ftp.Timeout = ;
string aa = "";
using (WebResponse response = ftp.GetResponse())
{
using (StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.ASCIIEncoding.UTF8))
{
aa = reader.ReadToEnd();
reader.Close();
response.Close();
}
}
string[] ftpFileList = aa.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
foreach(string line in ftpFileList)
{
if (line.Contains(""))
{
string dirName = GetFileName(line);
string newUrl = ftpURI + @"/" + dirName;
string newName = name + @"/" + dirName;
FtpFile[] files = GetFilesList(newUrl, newName);
foreach (FtpFile file in files)
{
result.Add(file);
}
}
else
{
string fileName = GetFileName(line);
string[] ftpFile = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
//获取文件的大小 和全路径
result.Add(new FtpFile() { FileSize = int.Parse(ftpFile[]), FileFullName = (name + @"/" + fileName).Substring() });
}
}
}
catch (Exception ex)
{
string message = ex.Message;
// Insert_Standard_ErrorLog.Insert("FtpWeb", "GetFilesDetailList Error --> " + ex.Message);
LogWriter.LogError(ex.Message);
}
return result.ToArray();
}
private string GetFileName(string line)
{
string newStr = line.Substring(line.IndexOf(" "));
newStr = newStr.TrimStart();
newStr = newStr.Substring(newStr.IndexOf(" "));
newStr = newStr.TrimStart();
newStr = newStr.Substring(newStr.IndexOf(" "));
return newStr.Trim();
}
/// <summary>
/// 获取当前目录下明细(包含文件和文件夹)
/// </summary>
public string[] GetFilesDetailList()
{
string[] downloadFiles;
try
{
StringBuilder result = new StringBuilder();
FtpWebRequest ftp;
ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
ftp.Credentials = new NetworkCredential(ftpUserName, ftpPassword);
ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
WebResponse response = ftp.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
//string aa = reader.ReadToEnd();
string line = reader.ReadLine();
while (line != null)
{
result.Append(line);
result.Append("\n");
line = reader.ReadLine();
}
result.Remove(result.ToString().LastIndexOf("\n"), );
reader.Close();
response.Close();
return result.ToString().Split('\n');
}
catch (Exception ex)
{
downloadFiles = null;
string message = ex.Message;
// Insert_Standard_ErrorLog.Insert("FtpWeb", "GetFilesDetailList Error --> " + ex.Message);
return downloadFiles;
}
}
#endregion
}
Ftp文件同步工具最终效果
Ftp实现文件同步的更多相关文章
- sftp ftp文件同步方案
sftp ftp文件同步方案 1. 需求 1.1实现网关服务器的ftp服务器的/batchFileRequest目录下文件向徽商所使用的sftp服务器的/batchFileRequest目录同步文件 ...
- 烂泥:linux文件同步之rsync学习(一)
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 这几天刚好有空就打算开始学习linux下的文件同步软件rsync,在学习rsync时,我们可以分以下几个步骤进行: 1. rsync是什么 2. rsy ...
- Rsync 3.1.0 发布,文件同步工具
文件同步工具Rsync 3.1.0发布.2013-09-29 上一个版本还是2011-09-23的3.0.9 过了2年多.Rsync基本是Linux上文件同步的标准了,也可以和inotify配合做实时 ...
- ftp (文件传输协议)
ftp (文件传输协议) 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议” ...
- Linux下利用rsync实现多服务器文件同步
windows做为文件服务器,使用rsync的windows服务版本,然后配置好就可以了.需要的朋友可以参考下. windows做为文件服务器,使用rsync的windows服务版本:cwRsyncS ...
- Windows Server 2008文件同步
配置Windows Server 2008文件同步 摘要: 众所周知,Linux系统可以用rsync来实现文件或目录的同步,windows系统下也一样可以.我们现在就用cwRsync来实现wind ...
- rsync 文件同步和备份
rsync 是同步文件的利器,一般用于多个机器之间的文件同步与备份,同时也支持在本地的不同目录之间互相同步文件.在这种场景下,rsync 远比 cp 命令和 ftp 命令更加合适,它只会同步需要更新的 ...
- CentOS安装和配置Rsync进行文件同步
Liunx系统实现文件同步不需要搭建FTP这类的工具,只需要按照Rsync配置下文件就可以. 本文以Centos7.0为例. 1. 首先关闭SELINUX(不关闭无法同步,权限太高了) vi /etc ...
- Rsync文件同步工具
前段时间因公司需求,需要把备份的文件进行同步保存,后面就想到了我们大家都最熟悉的文件同步工作Rsync,于是就捣鼓了一下午时间,然后总结了下大概过程和参数详情. 首先了解了下rsync同步的大致原理: ...
随机推荐
- Redis,MemCached,MongoDB 概述
调研项目主要有Redis. MemCached. MongoDB,以及Amazon的DynamoDB Redis 是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key- ...
- MD5加密类
public class MD5Util { public static String getMD5(String s) { char hexDigits[] = {'0', '1', '2', '3 ...
- iptables 下开放ftp
这两天在给客户安装服务器时也顺便给他们使用iptables,不用不知道,一用才发现iptables还有很多东西可以学的,比如开放ftp.iptables 的filter表的INPUT链的默认策略设为了 ...
- MySQL教程:数据库具体操作
1. 连接数据库服务器 $ ./mysql -h host_name -u user_name -p -h host_name(--host=host_name),连接的数据库主机名,如果在本地主机上 ...
- 如何修改TextField的Label和EmptyText
在需求中常常有修改form表单的标签和空文本提示,在渲染后组件有些字符固定下来 除非使用document进行原始修改,通过查询stackflow,我介绍更方便方法 模拟场景:点击ChangeLabel ...
- 利用 Makefile 写的小程序
1.建立一个工程 2.写一个进度条的程序(原理就是在同一位置重复打印某一个字符(变化),达到动态显示的效果) 所以说我们这里只用回车'\r',覆盖这一行以前的输出,重新向缓冲区写数据刷新缓冲区,就能达 ...
- Linux(Centos、Debian)之安装Java JDK及注意事项(转)
--转自:http://www.cnblogs.com/hanyinglong/p/5025635.html 说明:本人是以Debian 操作系统来进行安装的,这篇文章有很大帮助,才学Linux对有些 ...
- JAVA三大框架SSH的各自作用
一.Spring Spring是一个解决了许多在J2EE开发中常见的问题的强大框架. Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯. Spring的 ...
- 51单片机C语言学习笔记5:include的区别
#include <iostream.h>#include "myfile_h" #include 是预处理器标识符.<>表示是标准的工程.标准的头文件.查 ...
- 二叉查找树:Python实现
#coding:utf8 #author:HaxtraZ class BST(object): """二叉查找树的简单实现""" def _ ...