Imports System.IO
Imports SharpCompress.Archives
Imports SharpCompress.Archives.Zip
Imports SharpCompress.Common
Imports SharpCompress.Readers
Imports SharpCompress.Writers
Namespace Compress
Public Class Compress
'''
''' 压缩文件夹到zip文件
'''
''' 需要压缩的文件夹
''' 压缩后的zip文件路径
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
'''
''' 压缩文件至Zip文件
'''
''' 被压缩的文件路径
''' 压缩文件路径
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
'''
''' 压缩指定文件夹至tar格式文件,不会生成根文件目录
'''
''' 压缩文件名
''' 源文件夹
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
'''
''' 压缩指定文件列表到tar格式文件
'''
''' 文件列表
''' 压缩文件路径
''' 压缩文件所在文件夹路径
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
'''
''' 填充文件表,供压缩文件使用
'''
''' 文件列表
''' 需要压缩的文件夹
''' 文件前缀
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
'''
''' 解压Tar格式文件夹
'''
''' 文件路径
''' 目标文件夹
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