C# 备份、还原、拷贝远程文件夹
最近一直都很忙,非常抱歉好久没有写过博客了。最近遇到拷贝远程文件的一些工作,比如我们发布的web站点的时候,开发提供一个zip压缩包,我们需要上传到远程的服务器A,然后在部署(文件拷贝)到远程环境B和C,ABC都在一个局域网里面。文件压缩需要引用 System.IO.Compression和System.IO.Compression.FileSystem
首先我们需要一个工具类来转换文件路径,本地地址与远程地址的转换 比如192.168.0.1上的D:\test 转换 为\\192.168.0.1\D$\test,文件路径的拼接,
public class PathUtil
{
public static string GetRemotePath(string ip, string localPath)
{
if (!localPath.Contains(":"))
{
throw new Exception($"{localPath}路径必须是全路径且是本地路径");
}
localPath = localPath.Replace(":", "$");
return $@"\\{ip}\{localPath}";
} public static string GetLocaPath(string remotePath)
{
int index = remotePath.IndexOf("$");
if (index < )
{
throw new Exception($"{remotePath}路径必须包含磁盘信息");
} string temp = remotePath.Substring(index - );
temp = temp.Replace("$", ":");
return temp;
} public static string Combine(string path1, string path2)
{
path1 = path1.Trim();
path2 = path2.Trim(); if (path1.EndsWith("\\") && path2.StartsWith("\\"))
{
string ret = (path1 + path2).Replace("\\", "");
return ret;
}
else if (!path1.EndsWith("\\") && !path2.StartsWith("\\"))
{
return path1 + "\\" + path2;
}
// if ((path1.EndsWith("\\") && !path2.StartsWith("\\")) ||
//(!path1.EndsWith("\\") && path2.StartsWith("\\"))) { }
return path1 + path2;
}
}
备份远程目录的文件夹 (首先备份远程A目录到本地临时文件zip->拷贝到远程B->删除本地临时文件zip)
还原远程文件(部署发布包)(远程文件解压到本地临时目录->拷贝到目标服务器->删除本地临时目录)
文件夹得拷贝就比较简单,递归调用文件复制就okay了,比如 \\192.168.0.1\D$\test 拷贝到 \\192.168.0.2\D$\test下 (建议先删除存在文件在拷贝)。
相关code如下:
#region 文件操作部分
/// <summary>
/// 把一个目录下的文件拷贝的目标目录下
/// </summary>
/// <param name="sourceFolder">源目录</param>
/// <param name="targerFolder">目标目录</param>
/// <param name="removePrefix">移除文件名部分路径</param>
public void CopyFiles(string sourceFolder, string targerFolder, string removePrefix = "")
{
if (string.IsNullOrEmpty(removePrefix))
{
removePrefix = sourceFolder;
}
if (!Directory.Exists(targerFolder))
{
Directory.CreateDirectory(targerFolder);
}
DirectoryInfo directory = new DirectoryInfo(sourceFolder);
//获取目录下的文件
FileInfo[] files = directory.GetFiles();
foreach (FileInfo item in files)
{
if (item.Name == "Thumbs.db")
{
continue;
}
string tempPath = item.FullName.Replace(removePrefix, string.Empty);
tempPath = targerFolder + tempPath;
FileInfo fileInfo = new FileInfo(tempPath);
if (!fileInfo.Directory.Exists)
{
fileInfo.Directory.Create();
}
File.Delete(tempPath);
item.CopyTo(tempPath, true);
}
//获取目录下的子目录
DirectoryInfo[] directors = directory.GetDirectories();
foreach (var item in directors)
{
CopyFiles(item.FullName, targerFolder, removePrefix);
}
} /// <summary>
/// 备份远程文件夹为zip文件
/// </summary>
/// <param name="sourceFolder">备份目录</param>
/// <param name="targertFile">目标文件</param>
/// <returns></returns>
public bool BackZip(string sourceFolder, string targertFile)
{
string tempfileName = PathUtil.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + ".zip");
bool ret = false;
try
{
ZipFile.CreateFromDirectory(sourceFolder, tempfileName, CompressionLevel.Optimal, false);
var parentDirect = (new FileInfo(targertFile)).Directory;
if (!parentDirect.Exists)
{
parentDirect.Create();
}
File.Copy(tempfileName, targertFile, true);
ret = true;
}
catch (Exception ex)
{
throw new Exception($"备份目录{sourceFolder}出错{ex.Message}");
}
finally
{
if (File.Exists(tempfileName))
{
File.Delete(tempfileName);
}
}
return ret;
} /// <summary>
/// 把远程文件还原为远程目录
/// </summary>
/// <param name="sourceFile">远程文件</param>
/// <param name="targetFolder">远程目录</param>
/// <returns></returns>
public bool RestoreZip(string sourceFile, string targetFolder)
{
string tempFolderName = PathUtil.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
bool ret = false; try
{
using (ZipArchive readZip = ZipFile.OpenRead(sourceFile))
{
readZip.ExtractToDirectory(tempFolderName);
}
string copyFolder = tempFolderName;
//if (!Directory.GetFiles(copyFolder).Any() && Directory.GetDirectories(copyFolder).Length == 1)
//{
// copyFolder = Directory.GetDirectories(copyFolder)[0];
//}
CopyFiles(copyFolder, targetFolder, copyFolder);
ret = true;
}
catch (Exception ex)
{
throw new Exception($"发布文件{sourceFile}到{targetFolder}出错{ex.Message}");
}
finally
{
if (Directory.Exists(tempFolderName))
{
Directory.Delete(tempFolderName, true);
}
}
return ret;
}
#endregion
C# 备份、还原、拷贝远程文件夹的更多相关文章
- C# 拷贝指定文件夹下的所有文件及其文件夹到指定目录
要拷贝的文件及其文件夹结构 其中.lab文件不能覆盖 /// <summary> /// 拷贝oldlab的文件到newlab下面 /// </summary> /// < ...
- 设置好ftp后用xftp连接提示无法打开,无法显示远程文件夹
原文:设置好ftp后用xftp连接提示无法打开,无法显示远程文件夹 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/the_victory/artic ...
- 实测总结 挂载远程文件夹方案 smb ftp sftp nfs webdav
挂载远程文件夹的方法有: 1.smb 2.ftp 3.sftp 4.nfs 5.webdav 1.smb windows局域网使用的协议,windows网上邻居发现的共享文件夹即使用的smb协议,可以 ...
- xftp 提示无法显示远程文件夹
在用xftp远程服务器,打开文件夹的时候一直提示"无法显示远程文件夹" 解决方案: 1.网上大多解决方案是文件->属性->选项->将使用被动模式选项去掉即可 2. ...
- git删除远程文件夹或文件的方法
由于本地修改了文件夹大全名大小写的原因,同步到git上并不区分大小写,造成了一些文件同步不了,所以要先把git远程库上文件夹删除掉,然后再重新同步 如下,我把src里的全部移除,但是本地文件还保留. ...
- cmd命令 拷贝某文件夹及其子文件夹文件到其它文件夹
@ECHO OFF cd/d %H:\FileLoc\CNET&cd.. ::echo 拷贝"%H:\FileLoc\CNET"中文件到"H:\FileLocTe ...
- sublime sftp 打开远程文件夹
2014-04-29 13:19:09 总结: 本文介绍两种方法,推荐第二种方法(samba+windows映射) 先贴出sublime打开远程(Linux)目录所需的配置文件(sublime是通过s ...
- java拷贝指定文件夹下的指定文件类型
例如:把C:\Windows\SysWOW64下的所有dll文件拷贝到C:\Users\Administrator\Desktop\64dll这个目录 package com.xiaostudy.co ...
- 使用diff或者vimdiff比较远程文件(夹)与本地文件夹
方法1:管道给diff $ssh eric@192.168.1.11 "cat ~/remote_file.txt" | diff - ~/local_file.txt 如果 Fi ...
随机推荐
- google 与服务器搭建
一.申请账号 二.创建实例 VPN设置 :https://juejin.im/post/5b665a51f265da0f7d4f1ab3
- P3660 【[USACO17FEB]Why Did the Cow Cross the Road III G】
题外话:维护区间交集子集的小套路 开两个树状数组,一个维护进入区间,一个维护退出区间 $Query:$ 给定询问区间$l,r$和一些其他区间,求其他区间中与$[l,r]$交集非空的区间个数 用上面维护 ...
- 遍历集合的Iterator删除其中的元素
package list; import java.util.LinkedList; /* * 遍历集合的时候删除其中的元素 从后往前删,每次都删除的是最后一个元素,不涉及移位 */public cl ...
- 2018-2019-2 网络对抗技术 20165333 Exp1 PC平台逆向破解
1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串.该程序同 ...
- Ext.js项目(二)
人事管理模块: 1.机构管理 2.部门管理 3.人员管理 一:用例图
- Entity Framework解决sql 条件拼接,完美解决 解决 不支持 LINQ 表达式节点类型“Invoke”【转】
传统的操作数据库方式,筛选数据需要用StringBuilder拼接一大堆的WHERE子句. 在Entity Framework中,代码稍有不慎就会造成巨大性能消耗,如: using(var db=ne ...
- [转] 基于NodeJS的前后端分离的思考与实践(五)多终端适配
前言 近年来各站点基于 Web 的多终端适配进行得如火如荼,行业间也发展出依赖各种技术的解决方案.有如基于浏览器原生 CSS3 Media Query 的响应式设计.基于云端智能重排的「云适配」方案等 ...
- [九省联考2018]一双木棋chess
题解: 水题吧 首先很显然的是状压或者搜索 考虑一下能不能状压吧 这个东西一定是长成三角形的样子的 所以是可以状压的 相邻两位之间有几个0代表他们差几 这样最多会有2n 然后就可以转移了 由于之前对博 ...
- 6-16 单词 uva10129
了解了欧拉回路和欧拉道路的性质 : 欧拉道路 最多只有两个奇点(不可能只有一个奇点) 并且当有两个奇点的时候 一个奇点入比出多一 一个奇点出比入多一 采用并查集查看是否连同 如果连 ...
- 010 处理模型数据(ModelAndView,Map Model,@SessionAttributes)
1.处理数据模型 SpringMVC提供了几种途径出书模型数据 二:ModelAndView 1.介绍 2.index <%@ page language="java" co ...