In this tutorial/code example, I’m going to provide you with a piece of code to compress and decompress a file in VB.Net without using any additional libraries.
Option Explicit On
Option Strict On
Imports System.IO
Imports System.IO.Compression
Namespace FileSystem
Public Class Compressor
''' <summary>
''' This method deals with compressing a file
''' </summary>
''' <param name="fileLocation">The location of the file to be compressed</param>
''' <param name="outFileLocation">The full file path of the file to be saved</param>
''' <returns>True if the file was compressed successfully, else false</returns>
''' <remarks>If the output file already exists it will be overwritten</remarks>
Public Shared Function CompressFile(ByVal fileLocation As String, ByVal outFileLocation As String) As Boolean
Dim rtn As Boolean = True
Dim fsSource As FileStream = Nothing
Dim fsDest As FileStream = Nothing
Dim gzCompress As GZipStream = Nothing
Dim bufWrite() As Byte
If Not File.Exists(fileLocation) Then
Throw New FileNotFoundException
End If
If File.Exists(outFileLocation) Then
File.Delete(outFileLocation)
End If
Try
fsSource = New FileStream(fileLocation, FileMode.Open, FileAccess.Read, FileShare.Read)
bufWrite = New Byte(CInt(fsSource.Length)) {}
fsSource.Read(bufWrite, 0, bufWrite.Length)
fsDest = New FileStream(outFileLocation, FileMode.OpenOrCreate, FileAccess.Write)
gzCompress = New GZipStream(fsDest, CompressionMode.Compress, True)
gzCompress.Write(bufWrite, 0, bufWrite.Length)
Catch ex As Exception
rtn = False
Finally
If fsSource IsNot Nothing Then
fsSource.Close()
End If
If gzCompress IsNot Nothing Then
gzCompress.Close()
End If
If fsDest IsNot Nothing Then
fsDest.Close()
End If
End Try
Return rtn
End Function
''' <summary>
''' This method deals with decompressing a file
''' </summary>
''' <param name="fileLocation">The location of the file to decompress</param>
''' <param name="outFileLocation">The full file path to be saved to</param>
''' <returns>True if the decompression was successful, else false</returns>
''' <remarks>If the file destination already exists it will be overwritten</remarks>
Public Shared Function DecompressFile(ByVal fileLocation As String, ByVal outFileLocation As String) As Boolean
Dim rtn As Boolean = True
Dim bufWrite(1024) As Byte
Dim gzStream As GZipStream = Nothing
Dim fsSource As FileStream = Nothing
Dim fsDestin As FileStream = Nothing
Dim counter As Integer
Dim offset As Integer = 0
If Not File.Exists(fileLocation) Then
Throw New FileNotFoundException
End If
If File.Exists(outFileLocation) Then
File.Delete(outFileLocation)
End If
Try
fsDestin = New FileStream(outFileLocation, FileMode.Create)
fsSource = New FileStream(fileLocation, FileMode.OpenOrCreate)
gzStream = New GZipStream(fsSource, CompressionMode.Decompress, True)
counter = gzStream.Read(bufWrite, 0, bufWrite.Length)
While counter > 0
fsDestin.Write(bufWrite, 0, bufWrite.Length)
offset += counter
counter = gzStream.Read(bufWrite, 0, bufWrite.Length)
End While
Catch ex As Exception
rtn = False
Finally
If gzStream IsNot Nothing Then
gzStream.Close()
End If
If fsSource IsNot Nothing Then
fsSource.Close()
End If
If fsDestin IsNot Nothing Then
fsDestin.Close()
End If
End Try
Return rtn
End Function
End Class
End Namespace