2020-01-02 19:08:37 +08:00
|
|
|
|
#Region "Microsoft.VisualBasic::414b2776d52e8143899df9e18c2b1c62, Microsoft.VisualBasic.Core\Data\Repository\RepositoryFileSystem.vb"
|
|
|
|
|
|
|
|
|
|
|
|
' Author:
|
|
|
|
|
|
'
|
|
|
|
|
|
' asuka (amethyst.asuka@gcmodeller.org)
|
|
|
|
|
|
' xie (genetics@smrucc.org)
|
|
|
|
|
|
' xieguigang (xie.guigang@live.com)
|
|
|
|
|
|
'
|
|
|
|
|
|
' Copyright (c) 2018 GPL3 Licensed
|
|
|
|
|
|
'
|
|
|
|
|
|
'
|
|
|
|
|
|
' GNU GENERAL PUBLIC LICENSE (GPL3)
|
|
|
|
|
|
'
|
|
|
|
|
|
'
|
|
|
|
|
|
' This program is free software: you can redistribute it and/or modify
|
|
|
|
|
|
' it under the terms of the GNU General Public License as published by
|
|
|
|
|
|
' the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
|
' (at your option) any later version.
|
|
|
|
|
|
'
|
|
|
|
|
|
' This program is distributed in the hope that it will be useful,
|
|
|
|
|
|
' but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
|
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
|
' GNU General Public License for more details.
|
|
|
|
|
|
'
|
|
|
|
|
|
' You should have received a copy of the GNU General Public License
|
|
|
|
|
|
' along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
' /********************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
' Summaries:
|
|
|
|
|
|
|
|
|
|
|
|
' Module RepositoryFileSystem
|
|
|
|
|
|
'
|
|
|
|
|
|
' Function: GetFile, GetMostAppreancePath, LoadEntryList, (+3 Overloads) LoadSourceEntryList, SourceCopy
|
|
|
|
|
|
'
|
|
|
|
|
|
'
|
|
|
|
|
|
' /********************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
#End Region
|
|
|
|
|
|
|
|
|
|
|
|
Imports System.Runtime.CompilerServices
|
2019-11-28 20:11:50 +08:00
|
|
|
|
Imports Microsoft.VisualBasic.CommandLine.Reflection
|
|
|
|
|
|
Imports Microsoft.VisualBasic.ComponentModel.DataSourceModel
|
|
|
|
|
|
Imports Microsoft.VisualBasic.FileIO.Path
|
|
|
|
|
|
Imports Microsoft.VisualBasic.Language
|
|
|
|
|
|
Imports Microsoft.VisualBasic.Language.Default
|
|
|
|
|
|
Imports Microsoft.VisualBasic.Language.UnixBash
|
2019-12-20 21:23:06 +08:00
|
|
|
|
Imports Microsoft.VisualBasic.Linq.JoinExtensions
|
2019-11-28 20:11:50 +08:00
|
|
|
|
Imports Microsoft.VisualBasic.Scripting.MetaData
|
|
|
|
|
|
|
|
|
|
|
|
Namespace Data.Repository
|
|
|
|
|
|
|
|
|
|
|
|
''' <summary>
|
|
|
|
|
|
''' Using file system as repository system provider
|
|
|
|
|
|
''' </summary>
|
|
|
|
|
|
Public Module RepositoryFileSystem
|
|
|
|
|
|
|
|
|
|
|
|
''' <summary>
|
|
|
|
|
|
'''
|
|
|
|
|
|
''' </summary>
|
|
|
|
|
|
''' <param name="DIR"></param>
|
|
|
|
|
|
''' <param name="keyword"></param>
|
|
|
|
|
|
''' <param name="ext">元素的排布是有顺序的</param>
|
|
|
|
|
|
''' <returns></returns>
|
|
|
|
|
|
''' <remarks></remarks>
|
|
|
|
|
|
'''
|
|
|
|
|
|
<ExportAPI("Get.File.Path")>
|
|
|
|
|
|
<Extension> Public Function GetFile(DIR As String,
|
|
|
|
|
|
<Parameter("Using.Keyword")> keyword As String,
|
|
|
|
|
|
<Parameter("List.Ext")> ParamArray ext As String()) _
|
|
|
|
|
|
As <FunctionReturns("A list of file path which match with the keyword and the file extension name.")> String()
|
|
|
|
|
|
|
|
|
|
|
|
Dim Files As IEnumerable(Of String) = ls - l - wildcards(ext) <= DIR
|
|
|
|
|
|
Dim matches = (From Path As String
|
|
|
|
|
|
In Files.AsParallel
|
|
|
|
|
|
Let NameID = BaseName(Path)
|
|
|
|
|
|
Where InStr(NameID, keyword, CompareMethod.Text) > 0
|
|
|
|
|
|
Let ExtValue = Path.Split("."c).Last
|
|
|
|
|
|
Select Path,
|
|
|
|
|
|
ExtValue)
|
|
|
|
|
|
Dim LQuery =
|
|
|
|
|
|
From extType As String
|
|
|
|
|
|
In ext
|
|
|
|
|
|
Select From path
|
|
|
|
|
|
In matches
|
|
|
|
|
|
Where InStr(extType, path.ExtValue, CompareMethod.Text) > 0
|
|
|
|
|
|
Select path.Path
|
2019-12-20 21:23:06 +08:00
|
|
|
|
|
2019-11-28 20:11:50 +08:00
|
|
|
|
Return LQuery.IteratesALL.Distinct.ToArray
|
|
|
|
|
|
End Function
|
|
|
|
|
|
|
|
|
|
|
|
''' <summary>
|
|
|
|
|
|
''' Load the file from a specific directory from the source parameter as the resource entry list.
|
|
|
|
|
|
'''
|
|
|
|
|
|
''' [<see cref="FileIO.SearchOption.SearchAllSubDirectories"/>,这个函数会扫描目标文件夹下面的所有文件。]
|
|
|
|
|
|
''' 请注意,本方法是不能够产生具有相同的主文件名的数据的。假若目标GBK是使用本模块之中的方法保存或者导出来的,
|
|
|
|
|
|
''' 则可以使用本方法生成Entry列表;(在返回的结果之中,KEY为文件名,没有拓展名,VALUE为文件的路径)
|
|
|
|
|
|
''' </summary>
|
|
|
|
|
|
''' <param name="source"></param>
|
|
|
|
|
|
''' <returns></returns>
|
|
|
|
|
|
''' <remarks></remarks>
|
|
|
|
|
|
'''
|
|
|
|
|
|
<ExportAPI("Load.ResourceEntry")>
|
|
|
|
|
|
<Extension>
|
|
|
|
|
|
Public Function LoadSourceEntryList(<Parameter("Dir.Source", "The source directory which will be searchs for file.")> source As String,
|
|
|
|
|
|
<Parameter("List.Ext", "The list of the file extension.")> ext As String(),
|
|
|
|
|
|
Optional topLevel As Boolean = True) As Dictionary(Of String, String)
|
|
|
|
|
|
|
|
|
|
|
|
If ext.IsNullOrEmpty Then
|
|
|
|
|
|
ext = {"*.*"}
|
|
|
|
|
|
End If
|
|
|
|
|
|
|
|
|
|
|
|
Dim LQuery = (From path As String
|
|
|
|
|
|
In If(topLevel, ls - l, ls - l - r) - wildcards(ext) <= source
|
|
|
|
|
|
Select ID = BaseName(path),
|
|
|
|
|
|
path
|
|
|
|
|
|
Group By ID Into Group).ToArray
|
|
|
|
|
|
|
|
|
|
|
|
ext = LinqAPI.Exec(Of String) <= From value As String
|
|
|
|
|
|
In ext
|
|
|
|
|
|
Select value.Split(CChar(".")).Last.ToLower
|
|
|
|
|
|
|
|
|
|
|
|
Dim res As Dictionary(Of String, String) = LQuery _
|
|
|
|
|
|
.ToDictionary(Function(x) x.ID,
|
|
|
|
|
|
Function(x)
|
|
|
|
|
|
|
|
|
|
|
|
Return LinqAPI.DefaultFirst(Of String) _
|
|
|
|
|
|
_
|
|
|
|
|
|
() <= From path
|
|
|
|
|
|
In x.Group
|
|
|
|
|
|
Let pathValue = path.path
|
|
|
|
|
|
Let extValue As String = pathValue.Split("."c).Last.ToLower
|
|
|
|
|
|
Where Array.IndexOf(ext, extValue) > -1
|
|
|
|
|
|
Select pathValue
|
|
|
|
|
|
|
|
|
|
|
|
End Function)
|
|
|
|
|
|
|
|
|
|
|
|
With From entry
|
|
|
|
|
|
In res
|
|
|
|
|
|
Where Not String.IsNullOrEmpty(entry.Value)
|
|
|
|
|
|
Select entry
|
|
|
|
|
|
|
|
|
|
|
|
res = .ToDictionary(Function(x) x.Key,
|
|
|
|
|
|
Function(x) x.Value)
|
|
|
|
|
|
End With
|
|
|
|
|
|
|
|
|
|
|
|
Call $"{NameOf(ProgramPathSearchTool)} load {res.Count} source entry...".__DEBUG_ECHO
|
|
|
|
|
|
|
|
|
|
|
|
Return res
|
|
|
|
|
|
End Function
|
|
|
|
|
|
|
|
|
|
|
|
''' <summary>
|
|
|
|
|
|
''' 可以使用本方法生成Entry列表;(在返回的结果之中,KEY为文件名,没有拓展名,VALUE为文件的路径)
|
|
|
|
|
|
''' 请注意,这个函数会搜索目标文件夹下面的所有的文件夹的
|
|
|
|
|
|
''' </summary>
|
|
|
|
|
|
''' <param name="source"></param>
|
|
|
|
|
|
''' <param name="ext">文件类型的拓展名称</param>
|
|
|
|
|
|
''' <returns></returns>
|
|
|
|
|
|
''' <remarks></remarks>
|
|
|
|
|
|
<Extension> Public Function LoadSourceEntryList(source$, ParamArray ext$()) As Dictionary(Of String, String)
|
|
|
|
|
|
If Not FileIO.FileSystem.DirectoryExists(source) Then
|
|
|
|
|
|
Return New Dictionary(Of String, String)
|
|
|
|
|
|
End If
|
|
|
|
|
|
|
|
|
|
|
|
Dim LQuery = From path As String
|
|
|
|
|
|
In FileIO.FileSystem.GetFiles(source, FileIO.SearchOption.SearchAllSubDirectories, ext)
|
|
|
|
|
|
Select ID = BaseName(path),
|
|
|
|
|
|
path
|
|
|
|
|
|
Group By ID Into Group
|
|
|
|
|
|
Dim dict As Dictionary(Of String, String) =
|
|
|
|
|
|
LQuery.ToDictionary(Function(x) x.ID,
|
|
|
|
|
|
Function(x) x.Group.First.path)
|
|
|
|
|
|
Return dict
|
|
|
|
|
|
End Function
|
|
|
|
|
|
|
|
|
|
|
|
''' <summary>
|
|
|
|
|
|
''' 允许有重复的数据
|
|
|
|
|
|
''' </summary>
|
|
|
|
|
|
''' <param name="DIR"></param>
|
|
|
|
|
|
''' <param name="exts"></param>
|
|
|
|
|
|
''' <returns></returns>
|
|
|
|
|
|
''' <remarks></remarks>
|
|
|
|
|
|
<MethodImpl(MethodImplOptions.AggressiveInlining)>
|
|
|
|
|
|
<ExportAPI("Load.ResourceEntry")>
|
|
|
|
|
|
<Extension> Public Function LoadEntryList(<Parameter("Dir.Source")> DIR$, ParamArray exts$()) As NamedValue(Of String)()
|
|
|
|
|
|
Return LinqAPI.Exec(Of NamedValue(Of String)) _
|
|
|
|
|
|
_
|
|
|
|
|
|
() <= From path As String
|
|
|
|
|
|
In ls - l - ShellSyntax.r - wildcards(exts) <= DIR
|
|
|
|
|
|
Select New NamedValue(Of String) With {
|
|
|
|
|
|
.Name = path.BaseName,
|
|
|
|
|
|
.Value = path
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
End Function
|
|
|
|
|
|
|
|
|
|
|
|
''' <summary>
|
|
|
|
|
|
''' Load the file from a specific directory from the source parameter as the resource entry list.
|
|
|
|
|
|
''' </summary>
|
|
|
|
|
|
''' <param name="source"></param>
|
|
|
|
|
|
''' <returns></returns>
|
|
|
|
|
|
<ExportAPI("Load.ResourceEntry")>
|
|
|
|
|
|
<Extension>
|
|
|
|
|
|
Public Function LoadSourceEntryList(source As IEnumerable(Of String)) As Dictionary(Of String, String)
|
|
|
|
|
|
Dim LQuery = From path As String
|
|
|
|
|
|
In source
|
|
|
|
|
|
Select ID = BaseName(path),
|
|
|
|
|
|
path
|
|
|
|
|
|
Group By ID Into Group
|
|
|
|
|
|
Dim res As Dictionary(Of String, String) =
|
|
|
|
|
|
LQuery.ToDictionary(Function(x) x.ID,
|
|
|
|
|
|
Function(x) x.Group.First.path)
|
|
|
|
|
|
Return res
|
|
|
|
|
|
End Function
|
|
|
|
|
|
|
|
|
|
|
|
''' <summary>
|
|
|
|
|
|
''' Copy the file in the source list into the copyto directory, function returns the failed operation list.
|
|
|
|
|
|
''' (将不同来源<paramref name="source"></paramref>的文件复制到目标文件夹<paramref name="copyto"></paramref>之中)
|
|
|
|
|
|
''' </summary>
|
|
|
|
|
|
''' <param name="source"></param>
|
|
|
|
|
|
''' <param name="copyto"></param>
|
|
|
|
|
|
''' <returns>返回失败的文件列表</returns>
|
|
|
|
|
|
''' <remarks></remarks>
|
|
|
|
|
|
<ExportAPI("Source.Copy")>
|
|
|
|
|
|
Public Function SourceCopy(source As IEnumerable(Of String), CopyTo As String, Optional [Overrides] As Boolean = False) As String()
|
|
|
|
|
|
Dim failedList As New List(Of String)
|
|
|
|
|
|
|
|
|
|
|
|
For Each file As String In source
|
|
|
|
|
|
Try
|
|
|
|
|
|
Call FileIO.FileSystem.CopyFile(file, CopyTo & "/" & FileIO.FileSystem.GetFileInfo(file).Name, [Overrides])
|
|
|
|
|
|
Catch ex As Exception
|
|
|
|
|
|
Call failedList.Add(file)
|
|
|
|
|
|
Call App.LogException(New Exception(file, ex))
|
|
|
|
|
|
End Try
|
|
|
|
|
|
Next
|
|
|
|
|
|
|
|
|
|
|
|
Return failedList.ToArray
|
|
|
|
|
|
End Function
|
|
|
|
|
|
|
|
|
|
|
|
''' <summary>
|
|
|
|
|
|
''' Gets a directory path which is most frequent appeared in the file list.
|
|
|
|
|
|
''' </summary>
|
|
|
|
|
|
''' <param name="files"></param>
|
|
|
|
|
|
''' <returns></returns>
|
|
|
|
|
|
<ExportAPI("Get.FrequentPath")>
|
|
|
|
|
|
Public Function GetMostAppreancePath(files As IEnumerable(Of String)) As String
|
|
|
|
|
|
If files Is Nothing Then
|
|
|
|
|
|
Return ""
|
|
|
|
|
|
End If
|
|
|
|
|
|
|
|
|
|
|
|
Dim LQuery = From strPath As String
|
|
|
|
|
|
In files
|
|
|
|
|
|
Select FileIO.FileSystem.GetParentPath(strPath)
|
|
|
|
|
|
Return LQuery _
|
|
|
|
|
|
.TokenCount(ignoreCase:=True) _
|
|
|
|
|
|
.OrderByDescending(Function(x) x.Value) _
|
|
|
|
|
|
.FirstOrDefault _
|
|
|
|
|
|
.Key
|
|
|
|
|
|
End Function
|
|
|
|
|
|
End Module
|
2020-01-02 19:08:37 +08:00
|
|
|
|
End Namespace
|