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 ...
随机推荐
- python中的多继承
python和C++一样,支持多继承.概念虽然容易,但是困难的工作是如果子类调用一个自身没有定义的属性,它是按照何种顺序去到父类寻找呢,尤其是众多父类中有多个都包含该同名属性. class P1 #( ...
- Oracle 12c 数据库中scott用户不存在的解决方法
-- 使用超级管理员登录CONN sys/change_on_install AS SYSDBA ;-- 创建c##scott用户CREATE USER c##scott IDENTIFIED BY ...
- 记录:asp.net mvc 中 使用 jquery 实现html5 实现placeholder 密码框 提示兼容password IE6
@{ViewBag.Title = "完美结合";} <script>var G_start_time = new Date;</script> <! ...
- zookeeper的一些异常总结
1.Could not find the main class: org.apache.zookeeper.server.quorum.QuorumPeerMain. Program will ex ...
- iOS进阶学习-CoreData
一.CoreData数据库框架的优势 1.CoreData数据持久化框架是Cocoa API的一部分,首次在iOS5版本的系统中出现,它允许按照实体-属性-值模型组织数据,并以XML.二进制文件或者S ...
- Effective Objective-C 2.0之Note.03(属性详解)
用Objective-C等面向对象语言编程时,“对象”(object)就是“基本构造单元”(building block),开发者可以通过对象来存储并传递数据.在对象之间传递数据并执行任务的过程就叫做 ...
- 跨域访问-需要设置HTTP响应标头设置
跨域访问-需要设置HTTP响应标头设置 前提:服务端网站的配置(被请求的网站) 1.需要在IIS服务器站点的功能视图中设置HTTP响应标头: 2.双击“HTTP响应标头”进入设置界面 3.点击右侧添加 ...
- Linux虚拟机配置本地yum源
刚开始使用Linux,自己构建了一个Linux虚拟机之后,在使用yum install的时候,经常是出错,提示连接不上. 一直以为是自己构建的虚拟机的问题,后来在网上查找了一些资料,才发现:需要配置本 ...
- [shell基础]——tr命令
(1) tr 字符替换 测试文本内容 # cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4. ...
- Graceful degradation versus progressive enhancement
http://ued.taobao.org/blog/2008/10/understanding-progressiveen-hancement-chs-translation/ http://www ...