Files
staxrip/Source/General/Help.vb
T
2021-03-08 08:45:48 +01:00

241 lines
7.7 KiB
VB.net

Imports System.ComponentModel
Imports System.Globalization
Imports System.Management
Imports System.Reflection
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Text
Imports Microsoft.VisualBasic.FileIO
Public Class ObjectHelp
Shared Function GetCompareString(obj As Object) As String
Dim sb As New StringBuilder
ParseCompareString(obj, Nothing, sb)
Return sb.ToString
End Function
Shared Sub ParseCompareString(obj As Object, declaringObj As Object, sb As StringBuilder)
If TypeOf obj Is ICollection Then
For Each i In DirectCast(obj, ICollection)
If IsGoodType(i) Then
If IsToString(i) Then
sb.Append(i.ToString)
Else
ParseCompareString(i, obj, sb)
End If
End If
Next
Else
If IsGoodType(obj) Then
Dim t = obj.GetType
While Not t Is Nothing
For Each i As FieldInfo In t.GetFields(BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly)
If Not i.IsNotSerialized Then
Dim o = i.GetValue(obj)
If IsGoodType(o) Then
If IsToString(o) Then
sb.Append(i.Name + "=" + o.ToString + BR)
Else
If Not o Is declaringObj Then
ParseCompareString(o, obj, sb)
End If
End If
End If
End If
Next
t = t.BaseType
End While
End If
End If
End Sub
Private Shared Function IsGoodType(o As Object) As Boolean
If o Is Nothing Then Return False
If TypeOf o Is Pointer Then Return False
If TypeOf o Is PropertyChangedEventHandler Then Return False
If Not o.GetType.IsSerializable Then Return False
Return True
End Function
Private Shared Function IsToString(o As Object) As Boolean
If Not o Is Nothing Then
If o.GetType.IsPrimitive Then Return True
If TypeOf o Is String Then Return True
'some fields change here
If TypeOf o Is CultureInfo Then Return True
'some fields change here
If TypeOf o Is StringBuilder Then Return True
End If
End Function
<DebuggerHidden()>
Shared Function GetCopy(Of T)(o As T) As T
Using ms As New MemoryStream
Dim bf As New BinaryFormatter
bf.Serialize(ms, o)
ms.Position = 0
Return DirectCast(bf.Deserialize(ms), T)
End Using
End Function
End Class
Public Class FolderHelp
Shared Function HasFiles(path As String, Optional searchPattern As String = "*") As Boolean
Return Directory.Exists(path) AndAlso Directory.GetFiles(path, searchPattern).Count > 0
End Function
Shared Sub Create(path As String)
If Not Directory.Exists(path) Then
Directory.CreateDirectory(path)
End If
End Sub
Shared Sub Delete(
filepath As String, Optional recycleOption As RecycleOption = RecycleOption.DeletePermanently)
If Directory.Exists(filepath) Then
Try
FileSystem.DeleteDirectory(filepath, UIOption.OnlyErrorDialogs, recycleOption)
Catch ex As Exception
g.ShowException(ex)
End Try
End If
End Sub
Shared Sub Copy(source As String, target As String, Optional opt As UIOption = UIOption.OnlyErrorDialogs)
Try
FileSystem.CopyDirectory(source, target, opt)
Catch ex As Exception
g.ShowException(ex)
End Try
End Sub
Shared Sub Move(source As String, target As String)
Try
FileSystem.MoveDirectory(source, target, True)
Catch ex As Exception
g.ShowException(ex)
End Try
End Sub
Shared Function Compare(dir1 As String, dir2 As String) As Boolean
Return dir1.FixDir.ToUpperInvariant = dir2.FixDir.ToUpperInvariant
End Function
End Class
Public Class FileHelp
Shared Sub Move(src As String, dest As String)
If src.PathEquals(dest) OrElse Not File.Exists(src) Then
Exit Sub
End If
If File.Exists(dest) Then
Delete(dest)
End If
FileSystem.MoveFile(src, dest, UIOption.OnlyErrorDialogs, UICancelOption.DoNothing)
End Sub
Shared Sub Copy(src As String, dest As String, Optional opt As UIOption = UIOption.OnlyErrorDialogs)
If File.Exists(src) Then
If File.Exists(dest) Then
Delete(dest)
End If
FileSystem.CopyFile(src, dest, opt, UICancelOption.DoNothing)
End If
End Sub
Shared Sub Delete(
path As String,
Optional recycleOption As RecycleOption = RecycleOption.DeletePermanently)
Try
If File.Exists(path) Then
FileSystem.DeleteFile(path, UIOption.OnlyErrorDialogs,
recycleOption, UICancelOption.DoNothing)
End If
Catch
End Try
End Sub
Shared Function ReadAllText(path As String) As String
If path.FileExists Then
Return File.ReadAllText(path)
End If
Return ""
End Function
End Class
Public Class ProcessHelp
Shared Function GetConsoleOutput(
file As String,
arguments As String,
Optional stderr As Boolean = False) As String
Dim ret As String
Using proc As New Process
proc.StartInfo.UseShellExecute = False
proc.StartInfo.CreateNoWindow = True
proc.StartInfo.FileName = file
proc.StartInfo.WorkingDirectory = file.Dir
proc.StartInfo.Arguments = arguments
If stderr Then
proc.StartInfo.RedirectStandardError = True
proc.Start()
ret = proc.StandardError.ReadToEnd()
Else
proc.StartInfo.RedirectStandardOutput = True
proc.Start()
ret = proc.StandardOutput.ReadToEnd()
End If
proc.WaitForExit()
End Using
If ret Is Nothing Then
Return ""
End If
Return ret
End Function
Sub KillProcessAndChildren(pid As Integer)
Dim searcher As New ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" & pid)
Dim moc As ManagementObjectCollection = searcher.[Get]()
For Each mo As ManagementObject In moc
KillProcessAndChildren(Convert.ToInt32(mo("ProcessID")))
Next
Try
Dim proc As Process = Process.GetProcessById(pid)
proc.Kill()
' process already exited
Catch generatedExceptionName As ArgumentException
End Try
End Sub
Shared Function GetChilds(inputProcess As Process) As List(Of Process)
Dim searcher As New ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" & inputProcess.Id)
Dim ret As New List(Of Process)
For Each i As ManagementObject In searcher.Get()
ret.Add(Process.GetProcessById(CInt(i("ProcessID"))))
Next
Return ret
End Function
End Class
Public Class CommandLineHelp
Shared Function ConvertText(val As String) As String
If val = "" Then Return ""
Return Macro.Expand(val).Replace("""", "'").Trim
End Function
End Class