SMUI.Windows.Core

功能
--

此库包含 SMUI 的核心处理，数据计算、安装卸载、搜索项、等等功能都在其中

获取
--

* 如果你需要此库的 Windows 版本，可以在 Visual Studio 中的 NuGet 搜索并安装 Lake1059.SMUI
* 如果你需要此库的跨平台版本，请参阅 SMUI.MultiPlatform
* 也可以直接使用 SMUI 产品自带的文件

## Objects 类

包含在核心库中所有的公用对象定义

```
Enum InstallStatus

```
安装状态枚举值

* Unknow = -1：未知
* NotDeployed = 0：未配置
* Installed = 1：已安装
* UnInstalled = 2：未安装
* Incomplete = 3：安装不完整
* FolderCopied = 5：文件夹已复制
* FolderNotCopied = 6：文件夹未复制
* AdditionalContent = 10：附加内容
* FileReplaced = 20：文件已替换
* FileNotReplaced = 21：文件未替换
* FileCopied = 30：文件已复制
* FileNotCopied = 31：文件未复制
* NeedCopyFile = 35：需要复制文件（无安装判断）
* CoverContent = 40：覆盖游戏的 Content 文件夹

```
Structure ItemCalculateType

```
读取项信息时需要用到的计算类型，表示需要计算哪些信息，启用只需将需要的属性设置为 True 即可，合理使用以在不同的场景下节约性能开销

* All：全部，如果要全部计算，仅需将此属性设置为 True，其余不管
* InstallStatus：安装状态
* Name：清单中的 Name 键值
* Author：清单中的 Author 键值
* Version：清单中的 Version 键值
* InstalledVersion：已安装的版本
* MinimumApiVersion：清单中的 MinimumApiVersion 键值
* Description：清单中的 Description 键值
* UniqueID：清单中的 UniqueID 键值
* UpdateKeys：清单中的 更新键 数据，支持 NEXUS、ModDrop、Github
* ContentPackFor：清单中的 内容包依赖 数据
* Dependencies：清单中的 其他依赖 数据

```
Enum CDTask

```
用于内部计算的安装命令识别，这个一般不需要研究

* CDCD = 1
* CDGCD = 2
* CDMAD = 3
* CDGRF = 4
* CDGCF = 5
* CDF = 6
* CDVD = 10
* RQ\_D = 11
* RQ\_D\_IN = 12
* RQ\_D\_UN = 13
* RQ\_F = 14
* RQ\_F\_IN = 15
* RQ\_F\_UN = 16
* CR\_UN\_OFF = 31
* CR\_CG\_DB = 32
* SUB\_D\_EX\_IN = 51

## ItemInfoReader 类

读取项信息，使用的时候把这个类 New 到新的对象

```
Sub ReadItemInfo(ItemPath As String, CalculateType As Objects.ItemCalculateType, Optional GamePath As String = "")

```
读取项信息，仅需一行代码，全自动处理所有信息，部分计算类型需要使用游戏路径

返回的数据在此类下的对象中

* InstallStatus As Objects.InstallStatus = Objects.InstallStatus.Unknow：安装状态
* Name As String()：名称数组
* Author As String()：作者名数组
* Version As String()：版本号数组，建议使用第一个
* InstalledVersion As String()：已安装版本号数组，建议使用第一个
* MinimumApiVersion As String()：最小 SMAPI 版本号数组
* Description As String()：描述数组
* UniqueID As String()：UniqueID 数组
* NexusID As String()：N网ID数组
* ChuckleFishID As String()：呵呵鱼ID数组
* GitHub As String()：Gihub 仓库地址数组
* ModDrop As String()：ModDrop ID 数组
* ContentPackFor As String()：内容包依赖数组
* ContentPackForMinimumVersion As String()：内容包依赖最低版本号数组，与 ContentPackFor 数组的索引对应
* Dependencies As String()：其他依赖数组
* DependenciesIsRequired As Boolean()：其他依赖必须性数组，与 Dependencies 数组的索引对应
* DependenciesMinimumVersion As String()：其他依赖最低版本号数组，与 Dependencies 数组的索引对应
* NotInstalledFolders As String()：未安装的文件夹数组
* NotCopiedFolders As String()：未复制的文件夹数组
* NotReplacedFiles As String()：未替换的文件数组
* NotCopiedFiles As String()：未复制的文件数组

ErrorString 存储错误信息

```
Sub Reset()

```
重置所有对象的值

## TaskQueue 类

进行安装卸载，使用的时候把这个类 New 到新的对象

首先设置 ItemPath、GamePath、GameBackupPath 对象的值

```
Function LoadCode() As String

```
加载当前项的安装命令文件，程序自动转换为任务队列数组数据，记得用一个字符串对象接收返回值，正常执行返回空字符串，发生错误返回错误信息

加载后，以下四个对象就有了数据

* Task\_Code As Objects.CDTask()：用于识别是什么命令的对象
* Task\_Parameter1 As String()：参数1
* Task\_Parameter2 As String()：参数2
* Code\_LineMark As Integer()：安装命令的行号

这四个对象的索引都是互相对应的，所以元素数量也相同

```
Function PerformInstall(ByVal TaskIndex As Integer) As String

```
执行指定索引的安装操作，正常执行返回空字符串，发生错误返回错误信息

```
Function PerformUnInstall(ByVal TaskIndex As Integer) As String

```
执行指定索引的卸载操作，正常执行返回空字符串，发生错误返回错误信息

在产品中实现的时候，把所有索引循环一遍就是安装或卸载了。也就是说，核心中定义的是单步执行，在产品中根据实际需要来设计其他逻辑

## SearchItem 类

如果你的产品设计也遵循着我的 SMUI 产品的本体数据库结构（本地数据库文件夹 -> 子库文件夹 -> 分类文件夹 -> 模组项文件夹）的话，那么你可以直接使用这个类来实现功能完备的搜索功能，这只能在单个子库中进行搜索，不能跨子库操作。

```
Enum SearchType

```
搜索类型枚举值

* ItemName = 1 ：搜索项文件夹的名字
* NameKey = 2：搜索清单中的 Name 键值
* AuthorKey = 3：搜索清单中的 Author 键值
* UniqueID = 4：搜索清单中的 UniqueID 键值
* ContentPakForAndDependencies = 5：搜索清单中的依赖项信息，包括 ContentPakFor 内容包和 Dependencies 其他依赖项
* IncludedFolders = 6：搜索项的目录下直接包含的文件夹，不会搜索子目录
* NexusID = 7：搜索清单中的 Nexus 页面ID

在扫描之前，先设置三个选项对象的值

* ST\_NotCaseUpperAndLowerLetters As Boolean = False：表示不区分大小写，核心库中默认关闭
* ST\_NotCaseCHS\_ENG\_Symbol As Boolean = False：表示不区分中英文的标点符号，目前仅识别逗号和句号，核心库中默认关闭
* ST\_SingleCharacterFuzzySearch As Boolean = False：表示要进行逐字拆分搜索，将耗费更多的时间，核心库中默认关闭

```
Function StartSearch(FolderOneLevelAboveCategoryLevel As String, SearchWhat As String, yourSearchType As SearchType) As String

```
开始搜索。第一个参数是分类文件夹的上一级文件夹，在我的 SMUI 中的定义是子库层，SearchWhat 就是要搜索内容。正常运行返回空字符串，发送错误返回错误描述。

搜索结果在 Results 字符串数组对象中，存储的是项的完整路径！！注意使用

## SearchFile 类

搜索文件的这个类由核心库使用，但你也可以用，如果你想偷个懒不想自己写搜索文件的代码的话。

* 搜索结果在 FileCollection 字符串数组对象中，注意是相对路径
* 在传递扫描路径参数的时候路径结尾不要带斜杠，否则会出问题

```
Sub SearchFiles(DirectoryToScan As String, ScanSubDirectories As Boolean, Optional ExtensionName As String = "\*.\*")

```
可以用来搜索指定一个后缀的文件，也可以不设置默认搜索所有类型的文件

```
Sub SearchManifests(DirectoryToScan As String, Optional ScanSubDirectories As Boolean = True)

```
搜索 manifest.json 清单文件，核心库里用来得到单个项包含的所有清单，拥有智能套娃支持，非常带劲，当然你也可以用来扫描所有已安装模组的清单，怎么用随你

## SharedFunction 类

这个类里有一些共享的功能，可以直接使用，核心库本身也会使用它们

```
Shared Function FileEncryptSHA256(ByVal file\_name As String) As String

```
获取单个文件的 SHA256 效验值，参数请传递文件的完整路径。文件替换类安装命令就是用的这个功能验证文件

```
Shared Function CompareVersion(Version1 As String, Version2 As String) As Long

```
比较两个版本号的大小，已经对星露谷模组的版本号进行了专门优化。返回值如果大于0，说明版本1比版本2大，反之同理，如果返回0则相同

```
Shared Function SearchFolderWithoutSub(Path As String) As String()

```
获取一个目录下的所有文件夹名称，不会搜索子目录

```
Shared Function GetModUpdateID(ByVal OneLineText As String, ByVal FindID As String) As String

```
不建议你使用，这是针对 SMUI 核心库专门设计的。用于获取更新键ID

```
Shared Function GetModUpdatePlatformAddress(ByVal OneLineText As String, ByVal PlatformName As String) As String

```
不建议你使用，这是针对 SMUI 核心库专门设计的。用于获取更新键信息，跟上边的那个互有利弊

## DYString 类

核心库中有一些可翻译的文本，它们存储在这里，默认是英文的，我已经内置了中文翻译

```
Shared Sub TranslateAllStringToChinese()

```
调用这个即可把所有可进行翻译的文本翻译为内置简体中文