1 #Region "Microsoft.VisualBasic::a8d53bceb674239c349fbecda1c778df, Microsoft.VisualBasic.Core\ComponentModel\File\ITextFile.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     '     Class ITextFile
35     
36     '         Properties: (+2 Overloads) FilePath
37     
38     '         Function: __getDefaultPath, getEncoding, getPath, Save, ToString
39     
40     '         Sub: CopyTo, (+2 Overloads) Dispose
41     
42     
43     ' /********************************************************************************/
44
45 #End Region
46
47 Imports System.Text
48 Imports System.Web.Script.Serialization
49 Imports System.Xml.Serialization
50 Imports Microsoft.VisualBasic.CommandLine.Reflection
51 Imports Microsoft.VisualBasic.Language
52 Imports Microsoft.VisualBasic.Scripting.MetaData
53 Imports Microsoft.VisualBasic.Text
54
55 Namespace ComponentModel
56
57     ''' <summary>
58     ''' Object model of the text file doucment.(文本文件的对象模型,这个文本文件对象在Disposed的时候会自动保存其中的数据)
59     ''' </summary>
60     ''' <remarks></remarks>
61     Public MustInherit Class ITextFile : Inherits BaseClass
62         Implements IDisposable
63         Implements ISaveHandle
64         Implements IFileReference
65 #If NET_40 = 0 Then
66         Implements Settings.IProfile
67 #End If
68
69         ''' <summary>
70         ''' The storage filepath of this text file.
71         ''' </summary>
72         ''' <value></value>
73         ''' <returns></returns>
74         ''' <remarks></remarks>
75         '''
76 #If NET_40 = 0 Then
77         <XmlIgnore> <ScriptIgnore>
78         Public Overridable Property FilePath As String Implements Settings.IProfile.FilePath, IFileReference.FilePath
79 #Else
80         <XmlIgnore> <ScriptIgnore>
81         Public Overridable Property FilePath As String
82 #End If
83
84 #If NET_40 = 0 Then
85         Public MustOverride Function Save(Optional path As String = ""Optional encoding As Encoding = NothingAs Boolean Implements Settings.IProfile.Save, ISaveHandle.Save
86 #Else
87         Public MustOverride Function Save(Optional FilePath As String = ""Optional Encoding As Encoding = NothingAs Boolean Implements ISaveHandle.Save
88 #End If
89
90         Public Overrides Function ToString() As String
91             Dim path As String = FilePath
92
93             If String.IsNullOrEmpty(path) Then
94                 Return MyBase.ToString
95             Else
96                 Return path.ToFileURL
97             End If
98         End Function
99
100         Protected Friend Sub CopyTo(Of T As ITextFile)(ByRef TextFile As T)
101             TextFile.Extension = Extension
102             TextFile.FilePath = FilePath
103         End Sub
104
105         ''' <summary>
106         ''' Automatically determine the path paramater: If the target path is empty, then return
107         ''' the file object path <see cref="FilePath"></see> property, if not then return the
108         ''' <paramref name="path"></paramref> directly.
109         ''' (当<paramref name="path"></paramref>的值不为空的时候,本对象之中的路径参数将会被替换,反之返回本对象的路径参数)
110         ''' </summary>
111         ''' <param name="path">用户所输入的文件路径</param>
112         ''' <returns></returns>
113         ''' <remarks></remarks>
114         Protected Overridable Function getPath(path As StringAs String
115             If String.IsNullOrEmpty(path) Then
116                 path = FilePath
117             Else
118                 FilePath = path
119             End If
120
121             If String.IsNullOrEmpty(path) Then
122                 FilePath = __getDefaultPath()
123                 Return FilePath
124             End If
125
126             Return path
127         End Function
128
129         Protected Overridable Function __getDefaultPath() As String
130             Return ""
131         End Function
132
133         Protected Shared Function getEncoding(encoding As Encoding) As Encoding
134             If encoding Is Nothing Then
135                 Return Encoding.Default
136             Else
137                 Return encoding
138             End If
139         End Function
140
141 #Region "IDisposable Support"
142         Protected disposedValue As Boolean ' 检测冗余的调用
143
144         ' IDisposable
145         Protected Overridable Overloads Sub Dispose(disposing As Boolean)
146             If Not Me.disposedValue Then
147                 If disposing Then
148                     Call Save(encoding:=UTF8WithoutBOM)
149                     ' TODO:  释放托管状态(托管对象)。
150                 End If
151
152                 ' TODO:  释放非托管资源(非托管对象)并重写下面的 Finalize()。
153                 ' TODO:  将大型字段设置为 null。
154             End If
155             Me.disposedValue = True
156         End Sub
157
158         ' TODO:  仅当上面的 Dispose(      disposing As Boolean)具有释放非托管资源的代码时重写 Finalize()。
159         'Protected Overrides Sub Finalize()
160         '    ' 不要更改此代码。    请将清理代码放入上面的 Dispose(      disposing As Boolean)中。
161         '    Dispose(False)
162         '    MyBase.Finalize()
163         'End Sub
164
165         ' Visual Basic 添加此代码是为了正确实现可处置模式。
166         Public Overloads Sub Dispose() Implements IDisposable.Dispose
167             ' 不要更改此代码。    请将清理代码放入上面的 Dispose (disposing As Boolean)中。
168             Dispose(True)
169             GC.SuppressFinalize(Me)
170         End Sub
171 #End Region
172
173         Public Function Save(Optional path As String = ""Optional encoding As Encodings = Encodings.UTF8) As Boolean Implements ISaveHandle.Save
174             Return Save(path, encoding.CodePage)
175         End Function
176     End Class
177 End Namespace