# 工程 （改）

通常一个专业软件，都需要一个用来贯穿生命周期的记录模型，自由结构，方便业务的进行。

通常展示形式为树形文件列表，不过更为常见的是，一个文件，比如doc,ppt,psd。

这个记录的模型，通常可以导出素材，导出素材，其本身而言，并不重要。

---

工程文件的常见实现结构

1.文本，只更改后缀，（xml,json,yaml，ini ）

目前主流是使用xml作为工程的配置层，json作为参数配置层，yaml也颇为常见。

ini通常作为硬件参数配置，因为是winapi，在C++中调用简单，所以通常写硬件配置，在不复杂的情况下，会使用。c++中解析xml,json,yaml 等其他的结构，基本是需要引入额外的库。

2.自定义格式。结构体

通常从 一个特定的文件头开始， 通常是文件后缀的ASCII缩写，文件头的长度一定，方便检索。

中间的文件看情况分成若干种，比如为了快速写入设置的内存转移，比如为了兼容存储空间的压缩编码（mp4等）

制定一个私有格式的好处，无疑是很大的。但缺陷也很明显，用户愿不愿意为这个私有格式买账。

就像是pdf的国产私有格式ofd，或者是知网私有格式.caj  即使这些并不小众，但我想知道的人，除了对应领域不得不使用的人之外，应该还是比较少的，对其的二次开发和支持的软件也都非常小众。

当然也有取消的方式，因为目前公有的格式是固定的，所以让指定的私有格式，兼容原本的格式，不过这就更加吃力不讨好。

一脉相承的继承是比较常见的，比如高版本的软件可以打开低版本的工程，但是低版本不存在对应高版本的兼容性。

3.rar,sql更改后缀

这种方案是对于2的一种实现，常见的也比较多，比如docx,就是自定格式后的压缩格式。当然也有一些是建立了本地数据库的，比如sqlite。

这种方案，也好也不好，比较low

-----

目前配置文件关联，在windows 中

打开 HKEY_CLASSES_ROOT  

添加自定义的后缀名项，并在默认值中添加自定义的备注名值

添加刚才定义定义的备注名项，添加DefaultIcon ,默认值位需要添加的图标（注：icon 可以从exe ,0  中获取，或者dll 中获取，或注册表中获取）

添加shell (交互操作选项)，添加 open（操作，或者edit等），添加command 。

注册表修改完成之后，并不会自定更新，需要重启 explorer.exe （文件管理系统），或者重启系统也可以

具有管理员权限的情况下，可以强制重启。或者刷新注册表应用。

-----

工程文件

工程的概念是比较广泛的。建立层级视情况而定。

比较常见的，解决方案为最上极，一个解决方案下，软件只运行一个。一个解决方案下，有多个工程。

一个工程下，是一个轮次的文件。

解决方案下的配置参数，影响界面参数，工程中的配置参数，记录本次工程执行的参数，自定义文件中会记录，拍摄这张图片时，需要存储的参数。

同一个工程下的多次后续处理，以及相关的参数配置，应该保存在同一个工程目录中。

处理的文件，默认不保存在本地，只有选择了保存，才会保存，中间文件不存储。

文件的导出，是基于单个文件的，工程中提供批量导出的选项。

也可以创建一个空白的工程，然后导入外界的图像或者视频进行处理。

------

工程文件的结构应该是树形的，应该有继承关系，应该有属性，打开的时候，应该存在对应的命令。并且命令应该记录，可以撤销。



考虑到解耦，工程应该处理到具体文件的打开命令，具体的执行和工程模块的实现应该分离。



一套完整的软硬件系统，通常以工程作为核心，从采集数据保存到工程之中，然后处理数据，展示并导出结果。

一个批次的数据，应该被记录在工程的最外层，统计保存处理数据的状态。

导出结果的逻辑独立，一般是生成批次报表。



这个逻辑可以简化抽象出来，如果不需要回顾工程，那么可以 把工程剥离，只进行采集，处理，结果列表展示。

---

用户的逻辑独立于工程，可以绑定在其中，也可以不绑定在其中。做用户最大的好处是后续的联网处理。

否则，做的不是用户，是权限管理。

联网之后，可以做的事情就多了，但联网的安全性，是很难说的，所以目前主流的软件，虽然从技术上来看，实现这些都是小事情。

















