C#实现文件增量备份
最近将客户的一个ASP网站部署到了公司的机房云服务器上,该ASP网站的文件总容量已有将近4GB。
虽然现在硬盘容量很大,但每天一次完整备份的话,那占用的硬盘空间会急剧上升,考虑一个更优的备份方案就是每天一次增量备份,每月一次完整备份。
于是就有了自己动手写一个增量备份程序的念头,虽然网上可能已经有了很多增量备份的程序,但为了更加灵活和能够随时适应项目的个性化要求,就决定使用winform写一个备份程序。
代码实现思路:
1、首先对需要备份的文件夹下的所有文件信息进行初始化,将所有文件的完整路径及文件最后修改时间存储到数据库里(这里我采用的是SQLite数据库)。
2、备份时遍历文件夹下所有文件,然后通过文件的完整路径对数据库进行查询,如果查询不到数据,说明是新增的文件,这时就将文件复制到指定的备份目录下,并且将文件信息插入数据库;
如果查询到数据,则对文件最后修改时间进行比较,如果时间不一致,就说明文件有改动,这时就将文件复制到指定的备份目录下,并且将文件信息数据进行更新。
核心代码如下:
class Bakuper
{
private static string srcPath = ConfigurationManager.AppSettings["srcPath"];
private static string destPath = ConfigurationManager.AppSettings["destPath"];
private static int fileCount;
private static int copyCount;
private static SQLiteConnection conn; public static int backupFile()
{
fileCount = ;
copyCount = ;
conn = SQLHelper.getSQLiteConnection();
DirectoryInfo theFolder = new DirectoryInfo(srcPath);
readFolderList(theFolder);
readFileList(theFolder);
Console.WriteLine("共备份了" + copyCount+"个文件");
return copyCount;
} static void readFolderList(DirectoryInfo folder)
{
DirectoryInfo[] dirInfo = folder.GetDirectories();
//遍历文件夹
foreach (DirectoryInfo NextFolder in dirInfo)
{
readFolderList(NextFolder);
readFileList(NextFolder);
}
} static void readFileList(DirectoryInfo folder)
{
FileInfo[] fileInfo = folder.GetFiles();
foreach (FileInfo NextFile in fileInfo) //遍历文件
{
SQLiteCommand cmd = new SQLiteCommand("select lastWriteTime from " + SQLHelper.TB_NAME + " where fullPath='" + NextFile.FullName + "'", conn);
object obj = cmd.ExecuteScalar();
if (obj == null)//如果是新增的文件
{
String fullname = folder.FullName;
string newpath = fullname.Replace(srcPath, destPath + "\\" + DateTime.Now.ToString("yyyyMMdd"));
DirectoryInfo newFolder = new DirectoryInfo(newpath);
if (!newFolder.Exists)
{
newFolder.Create();
}
NextFile.CopyTo(newpath + "\\" + NextFile.Name, true);
SQLiteCommand cmdInsert = new SQLiteCommand(conn);//实例化SQL命令
cmdInsert.CommandText = "insert into " + SQLHelper.TB_NAME + " values(@fullPath, @lastWriteTime)";//设置带参SQL语句
cmdInsert.Parameters.AddRange(new[] {//添加参数
new SQLiteParameter("@fullPath", NextFile.FullName),
new SQLiteParameter("@lastWriteTime", NextFile.LastWriteTime)
});
cmdInsert.ExecuteNonQuery();
copyCount++;
}
else
{
DateTime lastWriteTime = DateTime.Parse(obj.ToString());
if (!DateTime.Parse(NextFile.LastWriteTime.ToString()).Equals(lastWriteTime))
{
String fullname = folder.FullName;
string newpath = fullname.Replace(srcPath, destPath + "\\" + DateTime.Now.ToString("yyyyMMdd"));
DirectoryInfo newFolder = new DirectoryInfo(newpath);
if (!newFolder.Exists)
{
newFolder.Create();
}
NextFile.CopyTo(newpath + "\\" + NextFile.Name, true);
SQLiteCommand cmdUpdate = new SQLiteCommand(conn);//实例化SQL命令
cmdUpdate.CommandText = "update " + SQLHelper.TB_NAME + " set lastWriteTime=@lastWriteTime where fullPath=@fullPath";
cmdUpdate.Parameters.AddRange(new[] {//添加参数
new SQLiteParameter("@fullPath", NextFile.FullName),
new SQLiteParameter("@lastWriteTime", NextFile.LastWriteTime)
});
cmdUpdate.ExecuteNonQuery(); copyCount++;
}
} Console.WriteLine("已遍历第" + (++fileCount) + "个文件");
}
}
}
C#实现文件增量备份的更多相关文章
- rsync服务架设(数据同步|文件增量备份)
近期由于业务需要,需要将两台服务器数据保持同步.方案有很多,rsync是其中一种解决方案,本文对rsync的安装及配置进行简单说明,其他实现方式有兴趣可以研究.以下是本文提纲,供参考: rsy ...
- 批处理向FTP上传指定属性的文件 批处理增量备份的例子
使用windows批处理向FTP上传具有指定属性的文件,类似增量备份功能. 对一个目录里的几个文件自动上传FTP时只上传有归档属性的文件,然后FTP上传成功后自动清除(本机)刚上传文件的归档属性. 类 ...
- 通过增量备份恢复来处理Oracle DG 复制GAP
1.确定增备scn范围,通过alert日志获取gap日志序列GAP - thread 1 sequence 109631-117170 2.根据序列获取增备起点SCN提示最小gap序列为109631, ...
- liunx系统mysql全量备份和增量备份
前提 在互联网项目中最终还是读数据进行操作,都离不开曾删改查,那么数据是重中之重,数据库的备份就显得格外重要. 但是每次都直接导出整个数据库的sql文件,显然是不现实的.对数据库的性能影响比较 ...
- python实现对文件的全量、增量备份
#!/user/bin/env python # @Time :2018/6/6 10:10 # @Author :PGIDYSQ #@File :FileBackup2.py import os i ...
- Python实现目录文件的全量和增量备份
目标: 1.传入3个参数:源文件路径,目标文件路径,md5文件 2.每周一实现全量备份,其余时间增量备份 1.通过传入的路径,获取该路径下面的所有目录和文件(递归) 方法一:使用os.listdir ...
- windows下使用RoboCopy命令进行文件夹增量备份
RoboCopy,它是一个命令行的目录复制命令,自从Windows NT 4.0 开始就成为windows 资源工具包的一部分,然后在Windows Vista.Windows 7和 Windows ...
- ORACLE RMAN备份及还原 RMAN能够进行增量备份:数据库,表空间,数据文件
ORACLE RMAN备份及还原 RMAN能够进行增量备份:数据库.表空间.数据文件 仅仅有使用过的block能够被备份成backup set 表空间与数据文件相应关系:dba_data_file ...
- 如何使用块更改跟踪文件估算RMAN增量备份大小 (Doc ID 1938079.1)
How to estimate RMAN incremental backup size using block change tracking file (Doc ID 1938079.1) APP ...
随机推荐
- 菜鸟学习Hibernate——简单的增、删、改、查操作
上篇博客利用Hibernate搭建起一个简单的例子,把数据库的映射显示了出来在上一篇的博客基础上这篇博客讲述如何利用Hinbernate框架实现简单的数据库操作. 1.加入junit.jar 2.新建 ...
- 正益工作是何许APP?凭什么作为第一届大会的“闪亮”点
参加过很多发布会,看过很多宣传稿,渐渐的你也读懂了“大会亮点”,这是技术人.市场人绞尽脑汁.加班加点的成果,更渗透着企业未来的战略思路.在2016AppCan移动开发者大会的官方新闻发布后,很多人留言 ...
- 【转】Git常用命令备忘
Git配置 git config --global user.name "robbin" git config --global user.email "fankai@g ...
- 今天开始应该使用 5 个JavaScript调试技巧
原文:5 Javascript debugging tips you’ll start using today 我之前使用过用 printf debugging,自此之后我用这种方法似乎总能更快地解决 ...
- 转:CentOS 7 安装Nginx
一.准备工作: 1.安装必备工具: ? 1 2 3 $ yum -y install gcc gcc-c++ autoconf automake $ yum -y install zlib zli ...
- json转换对象
JSON.parse(jsonstr); //可以将json字符串转换成json对象 JSON.stringify(jsonobj); //可以将json对象转换成json对符串
- U盘安装 Windows XP 原版 ISO 的几点心得
虽然我一直致力于推动最新操作系统的部署,劝说周围朋友尽快淘汰 Windows XP,但还是难免有一些老电脑.老朋友的电脑,坚持要使用 XP 系统. 这里有几点使用U盘安装 Windows XP 原版 ...
- CPU大小端判断
两种方式:1.通过指针 2.通过联合体,联合体里面的数据都是按顺序存储的,而且不论联合体里面有多少数据类型,联合体长度是最长的数据类型的长度.不论初始化多少联合体里面的数据,有效的是最 ...
- Kibana4学习<一>
Kibana4 安装方式依然简单,你可以在几分钟内安装好 Kibana 然后开始探索你的 Elasticsearch 索引.只需要预备: Elasticsearch 1.4.4 或者更新的版本 一个现 ...
- 关于java.lang.OutOfMemoryError: Java heap space的错误分析
今天无意间遇到这个错误:java.lang.OutOfMemoryError: Java heap space 问题出现原因:使用a标签实现快速下载[当然已经实现了,但想了想还是要归纳解决这类问题] ...