这是一套协助用户对文件进行处理、管理、备份、同步的工具集。
在开始这个项目之前的许多年,我已经陆续写了很多的用于备份、同步、管理文件或照片的软件,包括:
这些工具功能各异,界面各不相同,技术水平差异很大,操作方式也不尽相同。因此,我希望通过本项目,把这些工具进行整合,使用跨平台的Avalonia技术承载GUI。

| 附属文件清理 |
批量命令行执行 |
硬链接去重 |
文件筛选操作 |
 |
 |
 |
 |
| 文件筛选操作 |
文件可读性检测 |
 |
 |
| 文本智能生成(AI) |
文本简单加密 |
文档智能搜索(AI) |
 |
 |
 |
| 错别字检查(AI) |
编码识别与转换 |
逐行智能转换(AI) |
 |
 |
 |
| 修复照片修改时间 |
照片瘦身 |
照片地理信息写入 |
照片位置分类 |
 |
 |
 |
 |
| 视频时间戳字幕 |
 |
| 备份任务配置 |
备份管理中心 |
 |
 |
基本使用帮助
一套用来解决文件、目录(特别是图像文件)在预处理、整理、存档、浏览等环节存在问题的自动化工具
文件目录工具帮助
| 工具名 |
用途 |
期望解决的问题 |
原项目 |
按时间段分类
TimeClassify |
识别目录中相同时间段的文件,将它们移动到相同的新目录中 |
例如对于航拍照片,多次起飞的照片和视频会混在一起。通过该工具,可以通过拍摄时间来自动将不同航次的照片和视频进行归类。 |
照片归档工具 |
附属文件清理
TwinFileCleaner |
自动清理与主文件同名的关联文件。例如,当目录中存在.dng文件时,自动删除同名但不同后缀的.jpg等关联文件。 |
当拍摄了RAW+JPG格式的照片时,若决定处理RAW文件,那么JPG格式是多余的,需要删除。 |
照片归档工具 |
文件加密解密
Encryptor |
使用AES加密方法,对文件进行加密或解密 |
需要对一个文件夹内的文件和子文件进行加密,并需要保留目录结构,需要加密文件名、文件夹名或目录结构。 |
照片归档工具 文件夹加密 |
目录结构同步
DirStructureSync |
以一个目录为模板,将另一个目录中的文件同步到与模板内相同文件一直的位置 |
有两份初始状态一样的目录,其中一份中的某些文件进行了移动等操作,希望能够让另一份也同步应用更改,避免不必要的复制操作。 |
异地备份离线同步 控制台小程序集 |
目录结构克隆
DirStructureClone |
以一个目录为模板,生成一个新的目录,目录中文件与模板一致,但大小为0 |
需要保存一个目录的结构,但是不需要了解文件的内容,只是想用尽可能小的容量存储文件树状结构。 |
异地备份离线同步 文件归位器 |
批量重命名
Rename |
批量对一个目录中的文件或文件夹按规则进行重命名操作 |
需要对一个目录中的文件按一定规则进行重命名。 |
文件批量操作 |
重复文件清理
DuplicateFileCleanup |
清理一个目录内的重复文件,或已包含在另一个目录中的相同文件 |
一些相同的文件散落在各个地方,为了节省空间,需要删除一部分 |
控制台小程序集 |
批量命令行执行
BatchCommandLine |
以文件或目录为元素,批量执行命令行 |
有一个能够传入参数的可执行文件,需要将某个目录下的所有子目录或文件作为参数,传入可执行文件并运行,每个子目录或文件作为参数运行一次。例如需要对指定目录下筛选后的文件分别压缩。 |
|
硬链接去重
LinkDeduplication |
将一个目录中二进制相同的文件指向同一个硬盘物理地址,即硬链接,以减少磁盘占用 |
加入一个目录中有很多完全相同的文件,用这个工具可以大幅减少占用空间 |
|
文件筛选操作
FileFilterOperation |
对筛选后的文件进行复制、移动、删除操作 |
需要对某个目录中的一部分文件提取(复制、移动)到另一个位置,以及按规则删除文件或其他操作 |
文件批量操作 |
文件可读性检测
FileReadabilityScanner |
检查文件是否可以完整读取,并提供二进制比特的分布 |
磁盘可能产生损坏,需要检查是否有文件不可读;或文件有一场的可能性,检查文件中比特分布是否均匀 |
|
文本工具帮助
| 工具名 |
用途 |
期望解决的问题 |
调用AI |
原项目 |
文本智能生成
TextRewriter |
使用AI对文本进行表达优化、结构调整、内容转换、文本评价等 |
提高文本处理效率和质量,满足多样化文本生成与优化需求 |
√ |
|
文本简单加密
TextEncryption |
使用替换式密码的方式加密文本,实现防君子不防小人的文本加密 |
保护一般敏感信息(而不是高敏感性信息),实现轻量级可逆文本加密 |
|
文本加密工具 |
文档智能搜索
SmartDocSearch |
从多个文档中搜索关键词,并通过AI进行总结归纳 |
提升文档信息检索效率,快速定位关键内容并自动生成摘要 |
√ |
|
错别字检查
TypoChecker |
使用AI检查文本是否存在错别字 |
自动检测和修正文本错误,提高文本准确性和可读性 |
√ |
错别字检查工具 |
编码识别与转换
EncodingConverter |
识别文本文件的编码,并可以转换为指定编码 |
对一系列文本文件需要确定编码,或统一为指定编码格式 |
|
|
逐行智能转换
LineByLineProcessor |
针对每行文本调用AI进行独立转换,可用于分类、判断或文本改写等任务 |
针对大量需要基于语义进行非程序化判断的文本行,实现智能化逐行处理。它能够理解每行文本的深层含义,完成分类、判断、信息提取等复杂任务。 |
√ |
|
照片工具帮助
| 工具名 |
用途 |
期望解决的问题 |
原项目 |
修复照片修改时间
RepairModifiedTime |
寻找EXIF信息中的拍摄时间与照片修改时间不同的文件,将修改时间更新闻EXIF时间 |
对照片进行处理后,文件修改时间会更新,不利于部分软件的照片排序,需要从EXIF中读取实际拍摄时间,对文件修改时间进行更新。 |
照片归档工具 控制台小程序集 |
照片瘦身
PhotoSlimming |
复制或压缩照片,用于生成更小的照片集副本 |
需要将硬盘中整理后的部分照片复制到手机中以便随时查看,但可能存在文件过大放不进手机、只需要部分目录中的文件、只需要部分类型文件等需求。 |
照片归档工具 照片瘦身工具 |
照片地理信息写入
PhotoGeoTagging |
将GPX轨迹中的GPS位置信息,根据拍摄时间自动匹配并写入照片Exif |
相机拍摄的照片,不包含地理信息,无法根据位置查找照片。使用该工具,可以将拍摄时在相关工具记录的GPX轨迹中找到拍摄时间所在的位置,并写入照片元数据中。 |
|
照片位置分类
PhotoGeoSorter |
根据照片EXIF信息中的地理位置,以及用于提供分类标准的矢量数据,将照片移动到不同的目录 |
有大量的照片,这些照片由手机或其他能够定位的设备拍摄,并写入了位置信息。希望将这些数据 |
|
通过AI生成照片的文字标签,方便对大量照片的搜索和管理
照片标签帮助
| 工具名 |
用途 |
调用AI |
照片标签生成
PhotoTagGenerator |
通过AI,自动生成照片的关键词标签 |
√ |
图像标签管理
PhotoTagManager |
管理各图像的标签,进行新增、修改或和删除 |
|
照片标签搜索
PhotoTagSearcher |
根据关键词,查找指定标签的图像 |
|
关于视频的一些处理工作
视频帮助
| 工具名 |
用途 |
期望解决的问题 |
原项目 |
视频时间戳字幕
TimeAss |
为视频添加录制时间的字幕 |
对于一份拍摄的视频,希望能够在播放时了解拍摄时的时刻 |
为录像视频生成时间字幕 |
在无法通过网络或实地全量同步的情况下,使用增量同步的方式,利用小容量设备完成异地和本地磁盘的数据同步
异地备份工具帮助
| 工具名 |
用途 |
原项目 |
制作异地快照
Step1 |
在异地计算机创建所需要的目录快照 |
异地备份离线同步 |
本地生成补丁
Step2 |
在本地计算机生成与异地的差异文件的补丁包 |
异地备份离线同步 |
异地同步
Step3 |
在异地应用补丁包,实现数据同步 |
异地备份离线同步 |
将动态更新目录中的定期文件备份到多个容量有限、写入后不可修改介质(如光盘、一次性磁带)
动态固存备份帮助
| 工具名 |
用途 |
原项目 |
打包
Packing |
扫描文件特征,制作文件归档包 |
光盘归档工具 |
重建
Rebuild |
从文件归档包重建目录结构,或验证文件完整性 |
光盘归档工具 |
包信息和验证
Verify |
查看备份介质中文件包的信息,验证文件完整性 |
光盘归档工具 |
将目录中的文件定时或实时备份到另一个位置,支持全量备份或增量备份
自动备份服务帮助
| 工具名 |
用途 |
原项目 |
| 备份任务配置 |
对备份任务进行新增、删除、修改配置 |
文件自动备份系统 |
| 备份管理中心 |
查看备份任务的信息、进行手动备份,查看快照、快照文件、日志等 |
文件自动备份系统 |
下一步计划:增加FileWatcher备份、删除日志
解决方案主要结构为项目框架-模块的形式,各模块名称均为ArchiveMaster.Module.*,独立编译成dll,然后由ArchiveMaster.UI进行反射调用。这样做的目的是后续可以开放接口,不改动原始程序而进行开发,灵活加载新模块。
| 项目名称 |
类型 |
描述 |
依赖 |
ArchiveMaster.Core |
依赖编译 |
同时被.UI和.Module.*调用,包含一些基础的接口、基类、配置约定等 |
FzLib |
ArchiveMaster.UI |
依赖编译 |
界面管理程序 |
ArchiveMaster.Core |
ArchiveMaster.UI.* |
启动模块 |
具体平台的启动器 |
ArchiveMaster.UI |
ArchiveMaster.Module.* |
独立编译 |
每个模块在界面上显示为一个组别,同一类的工具放在同一个模块中 |
ArchiveMaster.Core |
除了ArchiveMaster.UI.*外,其余项目结构基本一致。本解决方案的主要结构是总(公共方法、接口、定义)-分(功能模块)-总(UI启动器)
| 项目名称 |
描述 |
Assets |
图标等素材文件,作为AvaloniaResource |
Behaviors |
控件行为相关文件 |
Configs |
工具的配置文件 |
Converters |
用于XAML的值转换器 |
Enums |
枚举类型 |
Services |
各工具~~~~的执行逻辑代码,每个Service拥有一个ConfigBase的属性。 |
ViewModels |
视图模型,连接Views、Configs和Services。 |
ViewModels.FileSystem |
用于表达文件或目录信息的类,继承自SimpleFileInfo。 |
Views |
UI视图界面。本软件实现了完全的MVVM。除UI项目外,Views中仅包含界面,不包含逻辑。 |
-
git clone https://github.com/f-shake/ArchiveMaster.git,将源代码下载至本地。
-
编辑Directory.Build.props:
- 将
UseLocalFzLib设置为false。
- 调整
OutputDir,或将SpecialOutputDir设置为false。
-
执行build.ps1PowerShell脚本,或在IDE中重新生成解决方案。build.ps1提供若干开关,可组合使用:
| 参数 |
说明 |
-w |
Windows (win-x64) |
-l |
Linux (linux-x64) |
-m |
macOS (osx-x64) |
-all |
所有平台 |
-s |
自包含发布 |
-c |
单文件压缩(仅自包含) |
-noSingleFile |
禁用单文件发布 |
一个模块表现为一个dll。步骤如下:
- 创建一个项目(或复制已有项目并清空),名称前缀约定为
ArchiveMaster.Module.,TargetFramework为net10.0,RootNamespace为ArchiveMaster
- 新增并实现一个或多个工具
- 新建一个类,实现
IModuleInfo,声明模块基本信息
一个工具,在界面上表现为主页上的一个标签页,在实现中表现为一组同前缀的View、ViewModel、Service、Config组成的类的集合。一般来说,步骤如下:
- 创建一个配置类,继承并实现
ConfigBase,用于保存配置
- 创建一个服务类,继承并实现
ServiceBase,用于工具的具体逻辑实现。大多数工具可以分为初始化和执行两步,这类工具可以继承并实现TwoStepServiceBase,实现InitializeAsync和ExecuteAsync时,应确保不会占用长期主线程。
- 创建一个视图模型类,继承并实现
ViewModelBase,用于页面的模型。大多数工具可以分为初始化和执行两步,这类工具可以继承并实现TwoStepViewModelBase。
- 创建一个视图类,继承
PanelBase,用于页面的模型。大多数工具可以分为初始化和执行两步,这类工具可以继承TwoStepViewModelBase。
- 在实现
IModuleInfo的类中更新工具相关信息