为什么软件开发人员应该编写自己的备份应用程序以及如何轻松完成

为什么要编写自己的备份应用程序?

我们中的许多人依靠OneDriveGoogle Drive等服务进行实时备份,并使用GitHubAzure DevOps来存储我们的源代码。如果只这样做,则可能会丢失所有备份数据,因为:

  • 像Google这样的服务提供商可以将您锁定在帐户之外,对此无能为力,并且会丢失所有备份,图片和电子邮件。
  • 病毒可以加密您的所有驱动器,并且由于它们会自动复制到云中,因此您将再次丢失所有数据。
  • 您可能错误地删除了文件,但只有在一段时间后才意识到这一点。当然,该文件也将在云中删除。

编写自己的备份程序的另一个原因是将所有数据复制到云中太昂贵了,例如您自己制作的视频文件或下载的音乐。

根据备份需求组织目录结构

您的文件有不同的备份需求,具体取决于您使用文件的方式及其大小:

  1. 重要文件,通常不是那么大,如MS Office文档:立即在线复制到云,并不时将所有这些文件复制到外部驱动器
  2. 软件开发文件:经常推送到GitHub并不时将所有这些文件复制到外部驱动器,而无需 obj 和 bin 目录。在这种情况下,您也无法备份 .git 目录,但如果您很少推送,您也应该备份它。
  3. 内容几乎不更改的较大文件,如图片或电影:将新的文件复制并将更改的文件更新到外部驱动器
  4. 存档:大文件和许多文件不会再次更改的集合,即您多年来收集的文件:当您获得新的外部驱动器时,复制所有内容一次。无需让它们参与备份运行。

根据备份需求将目录分组为几个主目录(云、存储库、存档)可能很有用。

保留重要文件的副本及其原始内容,即使它们后来被删除或更改。如果您在几个月后发现您错误地制作了它,那么您仍然可以获取原始版本。

双硬盘备份

如果计算机中有两个驱动器,则最快的备份是从一个驱动器备份到另一个驱动器。如果第一个驱动器出现故障或您在该驱动器上出错,这种备份很有用。但是:仅将其作为备份是不够的。一旦我的电脑被盗,如果没有外部备份,我就会丢失两个驱动器上的文件。由于这些原因,必须有一个外部驱动器并将其保存在与PC不同的位置。当还无法进行在线备份时,我过去每天都会快速备份到PC中的第二个驱动器,有时还会备份到外部驱动器。现在有了云存储,我觉得不再需要每日备份。

但是,备份的位置和频率实际上取决于您。由于您的需求可能与其他人不同,因此软件开发人员不需要备份objbin目录,因为它们很大,VS可以重新创建它们。如果您只是下载备份程序,它将不支持这种功能,但是如果您自己编写,则可以精确地适应您的需求。

清理备份目录

当您定期将所有重要文件备份到外部硬盘时,它可能会很快填满。这意味着您需要不时删除一些旧备份。删除最旧的备份是最容易的,但我建议另一个过程:

1)我通常将外部硬盘填满90%。发生这种情况时,我每隔删除一次备份目录。

2..4)每次达到90%时,我每隔一段时间就会删除一次备份目录。

这种方法的好处是,我仍然拥有第一个备份以及很少的旧备份和许多最近的备份。这有两个优点:

  1. 我不会丢失我获得外部驱动器时拥有的最早文件。
  2. 在最近的文件中经常犯错误。因此,在过去的几个月里拥有不同的副本会有所帮助,但对于较旧的时代,没有必要保留这么多细节。

当然,实际上,我并没有那么自律,以至于我每个月都精确地进行备份。实际上,只有当我觉得我进行了许多更改并且我不想丢失它们时,我才会不定期地备份到外部驱动器。有趣的是,删除每隔一个备份目录的方法也适用于这种情况。

编写您自己的备份应用程序

如果您从现有的MyBackup应用程序开始,然后添加所需的功能,这是最简单的。

概述我的备份应用程序

你可以从Github获得它,通过这个链接:github.com/PeterHuberSg/MyBackup

在窗口的上部,用户可以在左侧输入应为每个备份完全复制哪些目录。程序将首先在备份路径上创建一个新目录,名称是备份运行的日期。在该目录中,左侧列出的每个目录都会完全复制到该日期目录中。

在第一次备份运行期间,右侧的目录将完全复制到备份路径目录中,在随后的运行中,只会复制新添加和更改(名称相同,但日期或大小不同)的文件。对于更新的文件,旧版本会丢失。

Execute 开始备份,Purge每秒删除一次日期目录

窗口的下半部分向用户显示哪些顶级目录已经备份,并在最后一行显示当前正在复制的文件。备份可能涵盖数千个文件,当然用户将无法看到所有文件,因为小文件很快就会被覆盖,或者出于性能原因甚至无法显示。但是,如果用户可以读取文件名,他就知道现在复制了哪个大文件以及为什么备份没有更快地进行。

在备份运行时,用户可以滚动,这会停止自动滚动,但一旦用户滚动到末尾,自动滚动就会继续。

备份完成后,我喜欢检查输出中哪些目录很大,然后决定是否需要清理它们。

设计细节

如果您想MyBackup适应自己的需求,这里有一些提示可以帮助您快速入门。

通常,我将WPF应用设置为具有三个库:

  • 图形用户界面
  • 业务逻辑
  • 业务逻辑测试

但是由于MyBackup不需要太多代码并且一直与GUI紧密交互,因此我几乎将所有内容都放入MainWindow.xaml.cs并且很少有C#文件。

多线程

WPF设计组织得非常巧妙。所有UI活动都在WPF线程上运行,这意味着在对UI进行编码时不存在多线程问题。但是,备份活动应该在不同的Thread上运行,否则UI将冻结。通常会创建一个将在线程池线程上运行的线程Task。但是,在这个应用程序中,我决定使用它自己的Thread,因为对于大多数应用程序运行时,我们需要它。

这个线程应该向用户报告它正在做什么,基本上显示当前复制的文件。在实践中,我注意到这些平均每秒数百个文件!当然,并非所有这些文件都被复制,大多数时候它们没有改变,也不需要做任何事情。但是,每秒中断WPF数百次是一个坏主意。使用LogViewer解决了这个问题。

日志查看器

我写了一个特殊的WPF控件,请参阅我的文章:

LogViewer符合以下规格:

  • 多线程安全消息日志记录
  • 支持字体、粗体等,但使用LogViewer的代码不需要有任何WPF依赖项。
  • 区分临时消息和永久消息。临时消息将被任何后续消息覆盖,而后台任务完成后仍向用户显示永久消息。
  • 收集收到的所有消息,并每隔0.1秒将它们一起传输到WPF线程。

实现这一点是一个相当大的挑战。有关如何实现这一目标的详细信息,请阅读我的文章。

存储设置数据

用户不希望每次MyBackup运行时都键入需要备份的目录。在.NET Framework的过去可能不太好的时候,人们可以用Properties.Settings来轻松存储此类数据。在 .NET 6 中,WPF模板不再提供此功能我将此作为自己实现简单数据存储的提示。它是一个文本文件,存储用户输入的所有TextBox.Text数据,由<-=#=->分隔,希望用户永远不会输入的字符序列。

延伸阅读

如果你读到这里,你可能真的对WPF感兴趣,在这种情况下,我会热烈推荐我的其他一些WPF文章。我觉得现在的文章读起来不是那么有趣,但我的一些文章真的很有帮助,让你深入了解WPF,这是你在其他任何地方都找不到的:

我在Github上的项目

我还在Github上写了几个开源项目:

StorageLib

真正惊人的单用户WPF应用程序的数据库替换。程序员只需定义他要使用的C#类,代码生成器将用于在本地磁盘上永久创建、更新和删除数据的所有代码写入所有代码。这大大加快了开发人员的工作速度,因为他不再需要使用任何SQL,实体框架等。查询在Linq中完成,运行速度超快。代码的执行速度比任何数据库都快得多。支持事务、备份等。自5+年以来在多个项目中无错误运行。

TracerLib

实时高效地收集多线程数据,这些数据可以存储在文件中,也可以存储在RAM中并在一段时间后丢弃。这对于异常处理很有用,因为这允许告诉用户在异常发生之前(!)发生了什么。

WpfWindowsLib

用于数据输入的WPF控件,检测是否缺少所需数据或数据是否已更改。

https://www.codeproject.com/Articles/5342118/Why-SW-Developers-Should-Write-their-Own-Backup-Ap

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值