最近将客户的一个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. oracle - redo 损坏或删除处理方法

    OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - ...

  2. [INS-41112] Specified network interface doesnt maintain connectivi

    OS: Oracle Linux Server release 6.3 DB: Oracle 11.2.0.3 安装11.2.0.3.0的RAC,在安装GRID时报错: [INS-41112] Spe ...

  3. [原创]从Oracle和Microsoft Sql Server迁移到PostgreSQL Plus Advanced Server

    一.了解PPAS的迁移方式1.在线迁移和离线迁移使用Migration Studio或Migration Toolkit直接向PPAS数据库进行对象定义和数据表中数据的迁移称为在线迁移,生成要迁移对象 ...

  4. 【javascript】html5中使用canvas编写头像上传截取功能

    [javascript]html5中使用canvas编写头像上传截取功能 本人对canvas很是喜欢,于是想仿照新浪微博头像上传功能(前端使用canvas) 本程序目前在谷歌浏览器和火狐浏览器测试可用 ...

  5. [SRH.Docker] HBase Java 第一天学习记录

    主要对HBase Table 的 简单操作, 直接上代码吧!!! http://pan.baidu.com/s/1hqzTTze       ui92

  6. MySQL 触发器简单实例

    ~~语法~~ CREATE TRIGGER <触发器名称>  --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.{ BEFORE |  ...

  7. PHP调用WEBSERVICE接口常见问题答疑以及总结

    最近的工作项目中,接触到了很多的政府 微信开发项目.对方的外包公司都是使用JAVA作为开发语言,然后通过WEBSERVICE进行接口返回数据到我的项目中.一般情况下,能在浏览器打开并显示数据的接口是直 ...

  8. SharePoint 2010 中使用Ztree和EasyUI样式冲突问题

    <style type="text/css"> /*解决ztree和SharePoint样式冲突问题*/ .ztree li a { display: inline-b ...

  9. 将inline、template声明和定义在头文件中

    如果要在要在源文件(a.cpp)中内联的展开一个函数(fun),则该源文件(a.cpp)中必须包含此函数(fun)的定义.如果要在多个文件中内联的展开fun,则在所有的源文件中都必须包含fun的定义. ...

  10. 容器适配器之stack

    参见http://www.cplusplus.com/reference/stack/stack/ template<class T, class Container = deque<T& ...