实现备份轮换方案的备份实用程序(C#中的开源Windows窗体应用程序)
目录
介绍
备份架构
演示程序
程序源代码
- 下载源代码 - 83 KB
介绍
CopyTree是一个实现备份轮换方案的备份实用程序。它是一个用C#编写的开源Windows窗体应用程序。该实用程序旨在将关键文件夹备份到多个备份文件夹。运行该实用程序的结果是每个备份文件夹在给定时间是源文件夹的精确副本。每次运行该实用程序时,将使用当前源文件夹更新最旧的备份文件夹。换句话说,该实用程序在备份文件夹之间轮换。备份更新过程可确保备份目录结构与源目录相同。新文件从源复制到备份。已删除的文件将从备份中删除。已修改的文件将复制旧版本。未修改的文件将被忽略。除了第一次,
安装该实用程序后,您可以选择硬盘上的关键文件夹进行备份。我们将它们称为源文件夹。接下来,在外部硬盘驱动器上创建多个备份文件夹。我的选择是三个备份文件夹。每次运行该实用程序时,它都会将源文件夹备份到最早的这些备份文件夹中。结果是,您可以随时拥有源代码文件夹的三代副本。例如,如果您在一天结束时每天运行一次该实用程序,那么在第二天您将获得昨天,前天和前三天的副本。
复制过程将源文件夹结构与备份文件夹结构进行比较。如果源中存在文件或子文件夹且备份中不存在该文件或子文件夹,则该实用程序会将其从源复制到备份。如果备份中存在文件或子文件夹且源中不存在该文件或子文件夹,则该实用程序会从备份中删除该文件或子文件夹。如果源和备份中都存在文件,则该实用程序会比较源和备份的LastWriteTimeUtc文件。如果它们相等,则该实用程序假定自上次备份以来未修改该文件且未进行任何复制。如果上次写入时间不同,则实用程序将复制源文件并覆盖旧备份。
文件复制过程保留文件CreationTimeUtc,LastWriteTimeUtc和LastAccessTimeUtc。此外,文件属性标志:ReadOnly,Hidden,System,Archive和Normal将被保留。如果文件是只读的,并且需要删除它或覆盖它,则只删除只读标志。无法复制计算机上其他应用程序正在使用的源文件。异常将被try- catch对绑定,并将显示和记录错误消息。备份过程将继续。
备份架构
备份架构由两个列表组成。备份列表和源列表。每个列表由记录组成,每个记录包含两个字段。
- 备份根文件夹
- 上次备份日期和时间
- 备份根文件夹名称
- 备份子文件夹名称和源文件夹路径
- 备份子文件夹名称
- 源文件夹路径
下面,您将找到备份根文件夹列表的示例。该列表由外部硬盘驱动器G:上的三代备份轮换组成。
- 2018/01/01 17:12:20 G:\ Backup1
- 2018/01/02 17:35:43 G:\ Backup2
- 2018/01/03 18:01:05 G:\ Backup3
我们假设您要备份存储在文件夹C:\ MyDevelopment中的开发项目。并且您想要备份您的私人文档文件夹C:\ MyDocuments。该备份子文件夹名称和源文件夹路径将是:
- MyDevelopment C:\MyDevelopment
- MyDocuments C:\MyDocuments
如果Backup1选择作为当前备份,则CopyTree树将C:\MyDevelopment复制到G:\ Backup1\MyDevelopment文件夹。并且C:\MyDocuments到G:\Backup1\MyDocuments。
CopyTree主界面
CopyTree编辑架构界面
演示程序
在硬盘上创建一个文件夹CopyTree(或任何其他名称)。将CopyTree.exe复制到此文件夹。启动该程序。单击Edit Schema按钮。
将显示“编辑备份架构”窗体表单。添加一个或多个备份根文件夹。我的建议是三个。将建议的上次备份时间保留为当前时间。
添加一个或多个源文件夹路径及其相应的备份子文件夹。
单击保存。
如果所需的备份根目录结构不存在,CopyTree将请求您允许它来创建。
按“执行”执行备份。
备份进度将显示在屏幕顶部的信息文本标签中。
屏幕中央的错误日志将显示错误。通常,不会有错误。系统异常的最常见原因是尝试在文件使用时复制文件。
备份完成后,您可以按“查看日志”按钮或“查看错误”按钮查看所有活动。
程序源代码
Backup类是实用程序的心脏。该backup类使用BackgroundWorker类在后台线程中运行实际的备份进程。
CopyTree类展示了如何创建Backup类,如何启动备份,如何将结果记录,以及如何在过程完成时得到通知。
创建backup类并附加两个事件处理程序。
// create backup class
Backup Backup = new Backup();
Backup.WriteToLogFile += WriteToLogFile;
Backup.BackupCompletedEvent += OnBackupCompleted;
定义写入日志文件事件处理程序。
/// <summary>
/// Write to log file
/// </summary>
/// <param name="Control">Log or Error</param>
/// <param name="LogText">Message</param>
private void WriteToLogFile(LogControl Control, // LogControl is either Log or Errorstring LogText // text){// write to loe and error files}
定义备份完成事件处理程序。
/// <summary>
/// Backup process is completed
/// </summary>
private void OnBackupCompleted(bool BackupDone // true=normal completion, false=user pressed cancel){// perform completed event tasks}
初始化备份。
// set the selected index of the backup folder list
Schema.RootIndex = SelectedIndex;// initiate backup
Backup.BackupFolders(Schema);
Backup类的主要方法是PerformFolderBackup。它是遍历源和备份文件夹树的递归方法。
/// <summary>
/// recursive folder backup
/// </summary>
/// <param name="SourceFolderName">Source folder name</param>
/// <param name="BackupFolderName">Backup folder name</param>
private void PerformFolderBackup(DirectoryInfo SourceFolderInfo,DirectoryInfo BackupFolderInfo)
{
// cancel backup
if(BackupWorker.CancellationPending) throw new CanceBackupException();// backup folder full name shortcut
string BackupFolderFullName = BackupFolderInfo.FullName;// get source child files
FileInfo[] SourceFiles = SourceFolderInfo.GetFiles();// get backup child files
FileInfo[] BackupFiles = BackupFolderInfo.GetFiles();// source has files
if(SourceFiles.Length != 0){// backup has filesif(BackupFiles.Length != 0){// backup has filesEqualizeFiles(SourceFiles, BackupFiles, BackupFolderFullName);}// backup has no fileselse{// copy all source files to backup folderCopyFiles(SourceFiles, BackupFolderFullName);}}// source has no files but backup has files
else if(BackupFiles.Length != 0){// delete all files of backup folderDeleteFiles(BackupFiles);}// get source child folders
DirectoryInfo[] SourceFolders = SourceFolderInfo.GetDirectories();// get backup child folders
DirectoryInfo[] BackupFolders = BackupFolderInfo.GetDirectories();// source has folders
if(SourceFolders.Length != 0){// backup has foldersif(BackupFolders.Length != 0){// backup has foldersEqualizeFolders(SourceFolders, BackupFolders, BackupFolderFullName);}// backup has no folderselse{// copy all source child folders to backup folderCreateFolders(SourceFolders, BackupFolderFullName);}}// source has no folders but backup has folders
else if(BackupFolders.Length != 0){// delete all files of backup folderDeleteFolders(BackupFolders);}// done
return;
}
原文地址:https://www.codeproject.com/Articles/1223887/Backup-Utility-implementing-Backup-Rotation-Scheme
实现备份轮换方案的备份实用程序(C#中的开源Windows窗体应用程序)相关推荐
- 服务器维护简单的备份方案,服务器备份方案计划.doc
服务器备份方案计划 服务器备份方案 一.备份服务器硬件配置 备份服务器型号IBM X206,其硬件配置如下: CPU:P4 2.8G 内存:DDR ECC512M 硬盘:3*72G SCSI硬盘. 磁 ...
- 混合云存储组合拳:基于云存储网关与混合云备份的OSS数据备份方案
前言 阿里云对象存储(OSS)用户众多.很多用户因为业务或者合规性需求,需要对OSS内的数据做备份,无论是线上备份,还是线下备份.用户可以选择使用OSS的开放API,按照业务需求,做数据的备份,也可以 ...
- windows 自动备份mysql方案
windows 自动备份mysql方案 1.bat cd C:\Program Files\Huweishen.com\PHPWEB\MySQL Server 5.5\bin mysqldump -u ...
- 企业级MySQL数据库备份方案:增量备份、全量备份、逻辑备份
一份好的备份方案无非包括以下几点: 为什么需要备份? 备份的方式有哪些? 某几种备份方式的区别在哪? 备份实战操作概述 恢复实战操作概述 其它备注信息 那么,此文将从以上几个角度,结合一些实际的实战经 ...
- oracle异地容灾备份 英文6,异地容灾备份的方案.doc
异地容灾备份的方案 PAGE PAGE 4 异地容灾 数据备份解决方案 BakBone NetVault 2006-3 目 录 TOC \o "1-3" \h \z \u HYPE ...
- MySQL备份恢复方案
MySQL备份方案 随着数据不断增加,而且为了兼容以后的innodb存储引擎, 所以考虑采用mysqldump全备+日志增量备份的策略.使用mysqldump对于mysql大部分mysql存储引擎比如 ...
- Green Plum 非并行备份恢复方案
Green Plum 非并行备份恢复方案 环境 centos 7 主 145.170.41.153(master) root/123456 145.170.41.154(segment) root/1 ...
- 系统备份软件测试,备份软件测试方案
<备份软件测试方案>由会员分享,可在线阅读,更多相关<备份软件测试方案(17页珍藏版)>请在人人文库网上搜索. 1.备份一体机测试方案目录目录2第一章:测试环境配置31.1测试 ...
- 数字赋能、医疗智变——群晖备份存储方案,守护医疗数据“生命线”
随着我国医疗信息化建设的加快,数据量爆发式的增长,医疗行业的领域已迎来了自己的"大数据时代",但是大数据所带来的安全问题成为了医疗行业新的难题.数据对于企业的重要性不言而喻,一旦数 ...
最新文章
- 2022-2028年中国软件测试行业市场研究及前瞻分析报告
- 华为服务器万兆网卡驱动型号,华为万兆光模块型号参数大全
- shields 徽标_所有徽标看起来都一样
- PlateSpin forge V2P回推步骤。
- struts2随笔(一)Action、struts.xml、Interceptor细节
- 华为手机安卓系统可能停更,鸿蒙系统手机要来了
- 虚拟资源拳王公社:闲鱼虚拟资源玩法案例拆解,教你玩转虚拟资源,货源+方法
- Vijos P1335 数独验证【谜题】
- PowerDesigner数据库设计工具
- 【C/C++】Socket编程实例解析
- cdrx7拼版工具在哪里_Coreldraw x7/x8/2017/2018高版本保存为CDR 8.0低版本插件
- bledner做MMD心得(二)
- als算法参数_协调过滤算法之ALS
- 第四行记录到第12韩记录
- 55句史上最伤人的语录集:看完一阵心酸啊
- T40之小黑不能充电记
- 【Unity 实战100例】 教程 专栏《导航目录帖》带你深入学习Unity实战经验
- 如何在以太坊网络上发布自己的代币
- js 获取dom离页面编剧_页面对象之外:具有宁静性和编剧模式的下一代测试自动化
- TX2刷机和软件安装过程记录
热门文章
- 7z001怎么解压在安卓手机上面_安卓zip文件压缩RAR解压手机下载-安卓zip文件压缩RAR解压v1.0最新版下载...
- 如果你需要品质背景素材,看过来
- 牛年喜庆红色字体标题PSD素材!
- 游戏迷必备桌面|穿越火线壁纸,燃动少年心
- 设计灵感在哪里?集设网海纳百川,智慧的聚集地
- 美妆海报不会做? PSD分层模板轻松掌握大咖思路!
- Servlet要点、请求与响应
- cuSPARSE库:(六)cusparseMatrixType_t的说明
- DPDK | 如何在用户空间使用大页内存hugepage
- CPU Cache Line伪共享问题的总结和分析