diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb
index 7473e8667..ee1510452 100644
--- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb
@@ -83,82 +83,93 @@ Public Class PageVersionExport
#End Region
#Region "选项"
-
'''
''' 重新确认是否应该显示每个选项,并将 ExportOption 同步到 UI。
'''
Private Sub RefreshAllOptionsUI()
- '预先归纳所有至多二级的文件/文件夹
- Dim AllEntries As New List(Of String)
- Dim IsValidDirectory = '检查文件夹不为空
- Function(Folder As DirectoryInfo) As Boolean
- Try
- Return Folder.Exists AndAlso
- Folder.EnumerateFileSystemInfos().Any(Function(i) Not SubOptionBlackList.Any(Function(b) i.Name.ContainsF(b)))
- Catch '一般是由于无法访问,或是一个指向已不存在的文件夹的链接(例如使用 mklink 创造的 resource 文件夹链接)
- Return False
- End Try
- End Function
- Dim PathInfo As New DirectoryInfo(PageVersionLeft.Version.PathIndie)
- AllEntries.AddRange(PathInfo.EnumerateFiles().Select(Function(f) f.Name))
- For Each SubFolder In PathInfo.EnumerateDirectories().Where(IsValidDirectory)
- AllEntries.Add($"{SubFolder.Name}\")
- AllEntries.AddRange(SubFolder.EnumerateFiles().Select(Function(f) $"{SubFolder.Name}\{f.Name}"))
- AllEntries.AddRange(SubFolder.EnumerateDirectories().Where(IsValidDirectory).Select(Function(d) $"{SubFolder.Name}\{d.Name}\"))
- Next
- Log($"[Export] 共发现 {AllEntries.Count} 个可行的二级文件/文件夹")
- '确认选项是否应该被显示
- Dim IsVisible =
- Function(TargetOption As ExportOption) As Boolean
- '检查需要 OptiFine 或 Mod 加载器
- If TargetOption.RequireOptiFine AndAlso Not PageVersionLeft.Version.Version.HasOptiFine Then Return False
- If TargetOption.RequireModLoader AndAlso Not PageVersionLeft.Version.Modable Then Return False
- If TargetOption.RequireModLoaderOrOptiFine AndAlso Not PageVersionLeft.Version.Version.HasOptiFine AndAlso Not PageVersionLeft.Version.Modable Then Return False
- '粗略检查是否可能有符合规则的文件/文件夹
- Return StandardizeLines(If(TargetOption.Rules, TargetOption.ShowRules).Split("|"c), True).Any(
- Function(Rule As String)
- If Rule.StartsWithF("!") Then Return False '只看正向规则
- '检查前两级
+ Try
+ '预先归纳所有至多二级的文件/文件夹
+ Dim AllEntries As New List(Of String)
+ Dim IsValidDirectory = '检查文件夹不为空
+ Function(Folder As DirectoryInfo) As Boolean
Try
- If AllEntries.Any(Function(Entry) Entry Like Rule) Then Return True
- Catch ex As Exception
- Log(ex, $"错误的规则:{Rule}", LogLevel.Hint)
+ Return Folder.Exists AndAlso
+ Folder.EnumerateFileSystemInfos().Any(Function(i) Not SubOptionBlackList.Any(Function(b) i.Name.ContainsF(b)))
+ Catch '一般是由于无法访问,或是一个指向已不存在的文件夹的链接(例如使用 mklink 创造的 resource 文件夹链接)
Return False
End Try
- '粗略检查所有级
- Rule = Rule.Trim("*?".ToCharArray)
- If Rule.Split({"\"c}, StringSplitOptions.RemoveEmptyEntries).Count >= 3 Then
- If Rule.EndsWithF("\") Then
- Return IsValidDirectory(New DirectoryInfo(PageVersionLeft.Version.PathIndie & Rule)) '文件夹有效
+ End Function
+ Dim PathInfo As New DirectoryInfo(PageVersionLeft.Version.PathIndie)
+ AllEntries.AddRange(PathInfo.EnumerateFiles().Select(Function(f) f.Name))
+ For Each SubFolder In PathInfo.EnumerateDirectories().Where(IsValidDirectory)
+ AllEntries.Add($"{SubFolder.Name}\")
+ AllEntries.AddRange(SubFolder.EnumerateFiles().Select(Function(f) $"{SubFolder.Name}\{f.Name}"))
+ AllEntries.AddRange(SubFolder.EnumerateDirectories().Where(IsValidDirectory).Select(Function(d) $"{SubFolder.Name}\{d.Name}\"))
+ Next
+ Log($"[Export] 共发现 {AllEntries.Count} 个可行的二级文件/文件夹")
+ '确认选项是否应该被显示
+ Dim IsVisible =
+ Function(TargetOption As ExportOption) As Boolean
+ '检查需要 OptiFine 或 Mod 加载器
+ If TargetOption.RequireOptiFine AndAlso Not PageVersionLeft.Version.Version.HasOptiFine Then Return False
+ If TargetOption.RequireModLoader AndAlso Not PageVersionLeft.Version.Modable Then Return False
+ If TargetOption.RequireModLoaderOrOptiFine AndAlso Not PageVersionLeft.Version.Version.HasOptiFine AndAlso Not PageVersionLeft.Version.Modable Then Return False
+ '粗略检查是否可能有符合规则的文件/文件夹
+ Return StandardizeLines(If(TargetOption.Rules, TargetOption.ShowRules).Split("|"c), True).Any(
+ Function(Rule As String)
+ If Rule.StartsWithF("!") Then Return False '只看正向规则
+ '检查前两级
+ Try
+ If AllEntries.Any(Function(Entry) Entry Like Rule) Then Return True
+ Catch ex As Exception
+ Log(ex, $"错误的规则:{Rule}", LogLevel.Hint)
+ Return False
+ End Try
+ '粗略检查所有级
+ Rule = Rule.Trim("*?".ToCharArray)
+ If Rule.Split({"\"c}, StringSplitOptions.RemoveEmptyEntries).Count >= 3 Then
+ If Rule.EndsWithF("\") Then
+ Return IsValidDirectory(New DirectoryInfo(PageVersionLeft.Version.PathIndie & Rule)) '文件夹有效
+ Else
+ Return File.Exists(PageVersionLeft.Version.PathIndie & Rule) '文件有效
+ End If
Else
- Return File.Exists(PageVersionLeft.Version.PathIndie & Rule) '文件有效
+ Return False
End If
+ End Function)
+ End Function
+ '逐个检查选项
+ For Each CheckBox In GetAllOptions(True)
+ Dim TargetOption = GetExportOption(CheckBox)
+ '名称与简介
+ CheckBox.Inlines.Clear()
+ CheckBox.Inlines.Add(New Run(TargetOption.Title))
+ If Not String.IsNullOrEmpty(TargetOption.Description) Then
+ CheckBox.Inlines.Add(New Run(" " & TargetOption.Description) With {.Foreground = ColorGray5})
+ End If
+ '可见性、默认勾选
+ If String.IsNullOrEmpty(TargetOption.Rules) AndAlso String.IsNullOrEmpty(TargetOption.ShowRules) Then
+ CheckBox.Visibility = Visibility.Visible
+ CheckBox.Checked = TargetOption.DefaultChecked
Else
- Return False
+ Dim Pass As Boolean = IsVisible(TargetOption)
+ CheckBox.Visibility = If(Pass, Visibility.Visible, Visibility.Collapsed)
+ CheckBox.Checked = TargetOption.DefaultChecked AndAlso Pass
End If
- End Function)
- End Function
- '逐个检查选项
- For Each CheckBox In GetAllOptions(True)
- Dim TargetOption = GetExportOption(CheckBox)
- '名称与简介
- CheckBox.Inlines.Clear()
- CheckBox.Inlines.Add(New Run(TargetOption.Title))
- If Not String.IsNullOrEmpty(TargetOption.Description) Then
- CheckBox.Inlines.Add(New Run(" " & TargetOption.Description) With {.Foreground = ColorGray5})
- End If
- '可见性、默认勾选
- If String.IsNullOrEmpty(TargetOption.Rules) AndAlso String.IsNullOrEmpty(TargetOption.ShowRules) Then
- CheckBox.Visibility = Visibility.Visible
- CheckBox.Checked = TargetOption.DefaultChecked
- Else
- Dim Pass As Boolean = IsVisible(TargetOption)
- CheckBox.Visibility = If(Pass, Visibility.Visible, Visibility.Collapsed)
- CheckBox.Checked = TargetOption.DefaultChecked AndAlso Pass
+ Next
+ Catch ex As ThreadInterruptedException
+ Throw ex
+ Catch ex As Exception
+ Dim NeedFeedback As Boolean = True
+ If TypeOf(ex) Is DirectoryNotFoundException Then
+ NeedFeedback = False
+ FrmMain.PageChange(FormMain.PageType.Launch,0)
End If
- Next
+ Log(ex,"刷新整合包选项失败",If(NeedFeedback,LogLevel.Feedback,LogLevel.Msgbox))
+ End Try
End Sub
+
'''
''' 对文本行进行标准化处理,以便使用 Like 进行匹配。
'''