最近将客户的一个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#实现文件增量备份的更多相关文章

  1. rsync服务架设(数据同步|文件增量备份)

        近期由于业务需要,需要将两台服务器数据保持同步.方案有很多,rsync是其中一种解决方案,本文对rsync的安装及配置进行简单说明,其他实现方式有兴趣可以研究.以下是本文提纲,供参考: rsy ...

  2. 批处理向FTP上传指定属性的文件 批处理增量备份的例子

    使用windows批处理向FTP上传具有指定属性的文件,类似增量备份功能. 对一个目录里的几个文件自动上传FTP时只上传有归档属性的文件,然后FTP上传成功后自动清除(本机)刚上传文件的归档属性. 类 ...

  3. 通过增量备份恢复来处理Oracle DG 复制GAP

    1.确定增备scn范围,通过alert日志获取gap日志序列GAP - thread 1 sequence 109631-117170 2.根据序列获取增备起点SCN提示最小gap序列为109631, ...

  4. liunx系统mysql全量备份和增量备份

    前提 ​ 在互联网项目中最终还是读数据进行操作,都离不开曾删改查,那么数据是重中之重,数据库的备份就显得格外重要. ​ 但是每次都直接导出整个数据库的sql文件,显然是不现实的.对数据库的性能影响比较 ...

  5. python实现对文件的全量、增量备份

    #!/user/bin/env python # @Time :2018/6/6 10:10 # @Author :PGIDYSQ #@File :FileBackup2.py import os i ...

  6. Python实现目录文件的全量和增量备份

    目标: 1.传入3个参数:源文件路径,目标文件路径,md5文件 2.每周一实现全量备份,其余时间增量备份 1.通过传入的路径,获取该路径下面的所有目录和文件(递归) 方法一:使用os.listdir ...

  7. windows下使用RoboCopy命令进行文件夹增量备份

    RoboCopy,它是一个命令行的目录复制命令,自从Windows NT 4.0 开始就成为windows 资源工具包的一部分,然后在Windows Vista.Windows 7和 Windows ...

  8. ORACLE RMAN备份及还原 RMAN能够进行增量备份:数据库,表空间,数据文件

    ORACLE RMAN备份及还原   RMAN能够进行增量备份:数据库.表空间.数据文件 仅仅有使用过的block能够被备份成backup set 表空间与数据文件相应关系:dba_data_file ...

  9. 如何使用块更改跟踪文件估算RMAN增量备份大小 (Doc ID 1938079.1)

    How to estimate RMAN incremental backup size using block change tracking file (Doc ID 1938079.1) APP ...

随机推荐

  1. CF 191 总结

    A. Flipping Game 链接:http://codeforces.com/contest/327/problem/A 题意:从 i 到 j 翻转一次使得 1 的 个数最多~ 直接暴力搞~ # ...

  2. .NET开源工作流RoadFlow-系统布署中常见错误及处理方法

    1.未开启asp.net状态服务时会出现以下错误: 解决办法:开启ASP.NET STATE SERVICE服务 2.未开启应用程序池32位: 解决办法:启用32位

  3. Windows Phone中使用Native Code

    前言      Windows Phone 8 SDK中一个非常有用的特性,就是可以通过Windows Phone Runtime Component (WinPRT)使用C++代码来处理运算量大的任 ...

  4. C++函数传指针和传引用的区别

    从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有 ...

  5. Reverse String

    Write a function that takes a string as input and returns the string reversed. Example:Given s = &qu ...

  6. JavaScript插入节点

    1. document.write("<p>This is inserted.</p>"); 该方法必须加在HTML文档内,违背了结构行为分离原则,不推荐. ...

  7. 微软职位内部推荐-Software Engineer II-News

    微软近期Open的职位: News is a critical areas for integration of mobile and services, one of the top priorit ...

  8. Android -- View

    setContentView                                                                        只要你使用过Activity ...

  9. messager(消息窗口)

    一.$.messager.alert()类似js中的alert('String') 方法参数:title, msg, icon, function(回调函数) 描述:title头部面板标题.msg主要 ...

  10. Netsharp快速入门(之16) Netsharp基础功能(权限管理)

    第5章     Netsharp基础功能 5.1     权限配置 5.1.1  功能权限 1.配置权限功能点,打开平台工具-基础业务-操作管理 2.选择资源节点为销售订单,点添加常用操作,添加完成后 ...