Public Class Form1
Private MainArchive As New BsaArchive()
Private Shared Function FormatSize(ByVal OriginalSize As UInt32) As String
Dim Order As Double = Math.Log10(OriginalSize)
If Order < 3 Then
Return String.Format("{0:N0} B", OriginalSize)
ElseIf Order < 6 Then
Return String.Format("{0:N2} KB", OriginalSize / 1000)
ElseIf Order < 9 Then
Return String.Format("{0:N2} MB", OriginalSize / 1000000.0)
Else
Return String.Format("{0:N2} GB", OriginalSize / 1000000000.0)
End If
End Function
Private Sub strOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles strOpen.Click
If FOpenDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
Try
Dim Info As New IO.FileInfo(FOpenDialog.FileName)
MainArchive.Open(FOpenDialog.FileName)
lstProperties.Items.Clear()
With lstProperties
.AddItem("Data creazione", Info.CreationTime.ToLongDateString())
.AddItem("Ultima modifica", Info.LastWriteTime.ToLongDateString())
.AddItem("Dimensione", Info.Length & " bytes")
.AddItem("Numero cartelle", MainArchive.FoldersCount)
.AddItem("Numero files", MainArchive.FilesCount)
.AddItem("Versione", MainArchive.Version)
.AddItem("Compressione", If((MainArchive.ArchiveFlags And BsaArchiveFlags.CompressionEnabled) = BsaArchiveFlags.CompressionEnabled, "Sì", "No"))
Dim FileTypes As New System.Text.StringBuilder()
For Each Value As BsaFileTypeFlags In [Enum].GetValues(GetType(BsaFileTypeFlags))
If (MainArchive.FileTypeFlags And Value) = Value Then
FileTypes.Append([Enum].GetName(GetType(BsaFileTypeFlags), Value) & ", ")
End If
Next
.AddItem("Tipi file presenti", FileTypes.ToString())
End With
Dim FolderNode
As New TreeNode
(Folder.
Name)
FolderNode.ImageKey = "folder"
Dim FileNode
As New TreeNode
(String.
Format("{0} ({1})",
File.
Name, FormatSize
(File.
Size)))
If (MainArchive.
IsCompressionEnabled And File.
Size < 2
^ 31
) Or
(MainArchive.
IsCompressionEnabled = False And File.
Size >
= 2
^ 31
) Then
FileNode.ImageKey = "compressed"
Else
FileNode.ImageKey = "plainfile"
End If
FolderNode.Nodes.Add(FileNode)
Next
trwArchive.Nodes.Add(FolderNode)
Next
Catch Ex As Exception
MessageBox.Show( _
String.Format("Si è verificato un errore durante la lettura dell'archivio:{0}{0}Tipologia errore: {1}{0}Messaggio: {2}", _
Environment.NewLine, Ex.GetType().Name, Ex.Message), Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End If
End Sub
Private Sub strClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles strClose.Click
If MainArchive IsNot Nothing Then
MainArchive.Close()
lstProperties.Items.Clear()
trwArchive.Nodes.Clear()
MainArchive = Nothing
End If
End Sub
Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
If MainArchive IsNot Nothing Then
MainArchive.Close()
MainArchive = Nothing
End If
End Sub
Private Sub trwArchive_AfterCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles trwArchive.AfterCheck
If e.Node.ImageKey = "folder" Then
For Each Child As TreeNode In e.Node.Nodes
Child.Checked = e.Node.Checked
Next
End If
End Sub
Private Sub strExtractChecked_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles strExtractChecked.Click
If MainArchive Is Nothing Then
MessageBox.Show("Nessun archivio aperto!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Exit Sub
End If
If FolderBrowserDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
Dim SelFolder As String = FolderBrowserDialog.SelectedPath
Dim CurFolder As String
Dim CheckedItems As Int32 = 0
For Each FolderNode As TreeNode In trwArchive.Nodes
For Each FileNode As TreeNode In FolderNode.Nodes
If FileNode.Checked Then
CheckedItems += 1
End If
Next
Next
prgExtraction.Maximum = CheckedItems
prgExtraction.Value = 0
CurFolder = SelFolder
For Each FolderNode As TreeNode In trwArchive.Nodes
If strCreateFolders.Checked Then
CurFolder = SelFolder & "\" & FolderNode.Text
If Not IO.Directory.Exists(CurFolder) Then
IO.Directory.CreateDirectory(CurFolder)
End If
End If
For Each FileNode As TreeNode In FolderNode.Nodes
If FileNode.Checked Then
Try
MainArchive.
ExtractFile(MainArchive.
Folders(FolderNode.
Index).
Files(FileNode.
Index), CurFolder
)
Catch Ex As Exception
MessageBox.Show("Si è verificato un errore durante l'estrazione del file " & FileNode.Text & ". I dati potrebbero essere corrotti. Il programma continuerà comunque ad estrarre gli altri file.", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try
prgExtraction.Value += 1
Application.DoEvents()
End If
Next
Next
MessageBox.Show("Estrazione completata!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End Sub
Private Sub strExtractAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles strExtractAll.Click
If MainArchive Is Nothing Then
MessageBox.Show("Nessun archivio aperto!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Exit Sub
End If
If FolderBrowserDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
Dim SelFolder As String = FolderBrowserDialog.SelectedPath
Dim CurFolder As String
prgExtraction.Maximum = MainArchive.FilesCount
prgExtraction.Value = 0
CurFolder = SelFolder
For Each FolderNode As TreeNode In trwArchive.Nodes
If strCreateFolders.Checked Then
CurFolder = SelFolder & "\" & FolderNode.Text
If Not IO.Directory.Exists(CurFolder) Then
IO.Directory.CreateDirectory(CurFolder)
End If
End If
For Each FileNode As TreeNode In FolderNode.Nodes
Try
MainArchive.
ExtractFile(MainArchive.
Folders(FolderNode.
Index).
Files(FileNode.
Index), CurFolder
)
Catch Ex As Exception
MessageBox.Show("Si è verificato un errore durante l'estrazione del file " & FileNode.Text & ". I dati potrebbero essere corrotti. Il programma continuerà comunque ad estrarre gli altri file.", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try
prgExtraction.Value += 1
Application.DoEvents()
Next
Next
MessageBox.Show("Estrazione completata!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End Sub
Private Sub strExtractSchema_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles strExtractSchema.Click
If MainArchive Is Nothing Then
MessageBox.Show("Nessun archivio aperto!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Exit Sub
End If
If FSaveDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
Dim Schema As New IO.StreamWriter(FSaveDialog.FileName)
Schema.WriteLine("Offset Size File name")
Schema.
WriteLine(" Start Folder: {0}",
Folder.
Name)
Schema.
WriteLine("0x{0:X8} 0x{1:X8} {2}",
File.
Offset,
File.
Size,
Folder.
Name & "\" & File.
Name)
Next
Next
Schema.Close()
End If
End Sub
Private Sub strExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles strExit.Click
Me.Close()
End Sub
End Class