Files
AUTS_Desktop_Prod/UTS_Core/Compress/Compress.vb

146 lines
6.8 KiB
VB.net
Raw Normal View History

Imports System.IO
Imports SharpCompress.Archives
Imports SharpCompress.Archives.Zip
Imports SharpCompress.Common
Imports SharpCompress.Readers
Imports SharpCompress.Writers
Namespace Compress
Public Class Compress
''' <summary>
''' 压缩文件夹到zip文件
''' </summary>
''' <param name="dirPath">需要压缩的文件夹</param>
''' <param name="zipPath">压缩后的zip文件路径</param>
Public Shared Sub SaveDirToZip(dirPath As String, zipPath As String)
Using fileStream As FileStream = File.OpenWrite(zipPath)
Using archive As ZipArchive = ZipArchive.Create()
archive.AddAllFromDirectory(dirPath)
archive.SaveTo(fileStream)
End Using
End Using
End Sub
Public Shared Sub LoadFromZip(dirPath As String, zipPath As String)
Using fileStream As FileStream = File.OpenRead(zipPath)
Using reader As IReader = ReaderFactory.Open(fileStream)
Dim options As New ExtractionOptions With {.ExtractFullPath = True, .Overwrite = True, .PreserveFileTime = True}
While reader.MoveToNextEntry
If reader.Entry.IsDirectory = False Then
reader.WriteEntryToDirectory(dirPath, options)
End If
End While
End Using
End Using
End Sub
''' <summary>
''' 压缩文件至Zip文件
''' </summary>
''' <param name="filePath">被压缩的文件路径</param>
''' <param name="zipFilePath">压缩文件路径</param>
Public Shared Sub SaveFileToZip(filePath As String, zipFilePath As String)
If File.Exists(zipFilePath) Then File.Delete(zipFilePath)
Using tarStream As FileStream = File.OpenWrite(zipFilePath)
Using writer As IWriter = WriterFactory.Open(tarStream, ArchiveType.Zip, CompressionType.None)
writer.Write(Path.GetFileName(filePath), File.OpenRead(filePath), File.GetLastWriteTimeUtc(filePath))
End Using
End Using
End Sub
''' <summary>
''' 压缩指定文件夹至tar格式文件,不会生成根文件目录
''' </summary>
''' <param name="tarFilename">压缩文件名</param>
''' <param name="sourceDirectory">源文件夹</param>
Public Shared Sub TarCreateFromStream(tarFilename As String, sourceDirectory As String)
Dim filesPath As String = sourceDirectory
Using tarStream As FileStream = File.OpenWrite(tarFilename)
Using writer As IWriter = WriterFactory.Open(tarStream, ArchiveType.Tar, CompressionType.GZip)
writer.WriteAll(filesPath, "*", SearchOption.AllDirectories)
End Using
End Using
End Sub
''' <summary>
''' 压缩指定文件列表到tar格式文件
''' </summary>
''' <param name="fileList">文件列表</param>
''' <param name="tarFilePath">压缩文件路径</param>
''' <param name="dirFullPath">压缩文件所在文件夹路径</param>
Public Shared Sub TarFiles(fileList As List(Of String), tarFilePath As String, dirFullPath As String)
If File.Exists(tarFilePath) Then File.Delete(tarFilePath)
Using tarStream As FileStream = File.OpenWrite(tarFilePath)
Using writer As IWriter = WriterFactory.Open(tarStream, ArchiveType.Tar, CompressionType.GZip)
For i As Integer = 0 To fileList.Count - 1
If Right(fileList.Item(i), 1) = "\" OrElse Right(fileList.Item(i), 1) = "/" Then
writer.WriteAll($"{dirFullPath}\{fileList.Item(i)}", "*", SearchOption.AllDirectories)
Else
writer.Write(fileList.Item(i), File.OpenRead($"{dirFullPath}\{fileList.Item(i)}"), File.GetLastWriteTimeUtc($"{dirFullPath}\{fileList.Item(i)}"))
End If
Next
End Using
End Using
GC.Collect() '回收资源
End Sub
''' <summary>
''' 填充文件表,供压缩文件使用
''' </summary>
''' <param name="fileList">文件列表</param>
''' <param name="dir">需要压缩的文件夹</param>
''' <param name="prefix">文件前缀</param>
Public Shared Sub FillFileList(fileList As List(Of String), dir As String, prefix As String)
For Each fName As String In Directory.GetFiles(dir)
fileList.Add($"{prefix}/{Path.GetFileName(fName) }")
Next
For Each dirName As String In Directory.GetDirectories(dir)
FillFileList(fileList, dirName, $"{prefix}/{Path.GetFileName(dirName)}")
Next
End Sub
Public Shared Sub TarFiles(fileList As List(Of String), filePathList As List(Of String), tarFileName As String)
If File.Exists(tarFileName) Then File.Delete(tarFileName)
Using tarStream As FileStream = File.OpenWrite(tarFileName)
Using writer As IWriter = WriterFactory.Open(tarStream, ArchiveType.Tar, CompressionType.GZip)
For i As Integer = 0 To fileList.Count - 1
If Right(fileList.Item(i), 1) = "\" OrElse Right(fileList.Item(i), 1) = "/" Then
writer.WriteAll($"{filePathList(i)}", "*", SearchOption.AllDirectories)
Else
writer.Write(fileList.Item(i), File.OpenRead($"{filePathList(i)}"), File.GetLastWriteTimeUtc($"{filePathList(i)}"))
End If
Next
End Using
End Using
End Sub
''' <summary>
''' 解压Tar格式文件夹
''' </summary>
''' <param name="filePath">文件路径</param>
''' <param name="destDirectory">目标文件夹</param>
Public Shared Sub TarExtractToDirectory(filePath As String, destDirectory As String)
Using tar As Stream = File.OpenRead(filePath)
Using reader As IReader = ReaderFactory.Open(tar)
While reader.MoveToNextEntry
If Not reader.Entry.IsDirectory Then
Dim a As New ExtractionOptions With {
.ExtractFullPath = True,
.Overwrite = True,
.PreserveFileTime = True
}
reader.WriteEntryToDirectory(destDirectory, a)
End If
End While
End Using
End Using
End Sub
End Class
End Namespace