از بسته های Gzip و Zlib برای فشرده سازی و از حالت فشرده خارج کردن فایل ها در Golang استفاده کنید.
الگوریتمهای Gzip و Zlib معمولاً برای فشردهسازی و از حالت فشردهسازی فایلها استفاده میشوند. Gzip در درجه اول برای فشرده سازی یک فایل استفاده می شود، در حالی که Zlib عمدتاً جریان های داده را فشرده می کند. الگوریتم ها از الگوریتم فشرده سازی Deflate برای فشرده سازی استفاده می کنند، اگرچه Gzip ویژگی های اضافی از جمله بررسی خطا و ابرداده فایل را ارائه می دهد.
Gzip نسبت فشرده سازی بهتری نسبت به Zlib ارائه کرده است. با این حال، Gzip به قدرت پردازش بیشتری برای فشرده سازی و از حالت فشرده سازی داده ها نیاز دارد. در بیشتر موارد، باید از Gzip برای فشرده سازی فایل ها و از Zlib برای فشرده سازی جریان های داده استفاده کنید.
Go قابلیت فشرده سازی داده ها، از جمله فایل ها را از طریق بسته فشرده سازی فراهم می کند.
بسته فشرده سازی
بسته فشرده سازی از فشرده سازی داده ها از طریق بسته های compress/gzip و compress/zlib در میان سایر قابلیت ها پشتیبانی می کند.
بسته gzip از فشرده سازی و از حالت فشرده خارج کردن داده های فرمت فایل gzip، از جمله عملیات خواندن و نوشتن همانطور که در RFC 1952 مشخص شده است، پشتیبانی می کند. در حالی که بسته zlib به فشرده سازی و رفع فشرده سازی داده ها در قالب zlib کمک می کند.
می توانید gzip و zlib را از بسته فشرده با استفاده از کلمه کلیدی import وارد کنید.
import (
"compress/gzip" // import gzip
"compress/zlib" // import zlib
)
فشرده سازی و از حالت فشرده خارج کردن فایل ها با Gzip
Gzip یک فرمت فایل و یک نرم افزار کاربردی برای فشرده سازی و رفع فشرده سازی فایل است. Gzip از الگوریتم زنجیره ای Lempel-Ziv-Markov (LZ77) برای فشرده سازی داده ها استفاده می کند و این الگوریتم اغلب برای فشرده سازی فایل های متنی مانند فایل های HTML، CSS یا جاوا اسکریپت استفاده می شود.
فرآیند فشرده سازی فایل ها با بسته gzip ساده و شهودی است. شما باید فایل را باز کنید، یک فایل gzip بسازید، یک gzip writer بسازید، و محتویات فایل اصلی را در gzip writer کپی کنید، قبل از عملیات flush که تضمین می کند فرآیند نوشتن کامل شده است.
این دستور bash را در ترمینال دایرکتوری کاری خود در سیستم های یونیکس اجرا کنید تا یک فایل متنی نمونه ایجاد کنید و سپس متن را در فایل وارد کنید.
// creates a text file.
touch example.txt
// pipes the string to the file
echo 'Hello, world!' > example.txt}
پس از ایجاد فایل و درج متن، می توانید بسته های gzip، io و os را برای عملیات فشرده سازی وارد کنید.
در اینجا نحوه استفاده از بسته compress/gzip برای فشرده سازی یک فایل متنی آمده است.
import (
"compress/gzip"
"io"
"os"
)
func main() {
// Open the original file
originalFile, err := os.Open("example.txt")
if err != nil {
panic(err)
}
defer originalFile.Close()
// Create a new gzipped file
gzippedFile, err := os.Create("example.txt.gz")
if err != nil {
panic(err)
}
defer gzippedFile.Close()
// Create a new gzip writer
gzipWriter := gzip.NewWriter(gzippedFile)
defer gzipWriter.Close()
// Copy the contents of the original file to the gzip writer
_, err = io.Copy(gzipWriter, originalFile)
if err != nil {
panic(err)
}
// Flush the gzip writer to ensure all data is written
gzipWriter.Flush()
}
تابع Open بسته os فایل متنی را باز می کند و تابع Close فایل را با دستور defer بسته می کند. تابع Create یک فایل gzip ایجاد می کند و تابع NewWriter بسته gzip محتوای فایل متنی را با استفاده از تابع Copy بسته io در فایل gzip می نویسد.
روش Flush در نمونه gzipWriter، زمانی که همه دادهها در فایل فشرده شده موجود باشد، gzip writer را شستشو میدهد.
شما می توانید فایل اصلی را از طریق یک فرآیند فشرده سازی از یک فایل gzip بازیابی کنید. فرآیند از حالت فشرده خارج کردن یک فایل مشابه است. فایل را باز میکنید و یک فایل خوان gzip ایجاد میکنید، سپس یک فایل جدید برای نگهداری دادههای فشرده نشده قبل از کپی کردن محتویات در فایل جدید ایجاد میکنید.
import (
"compress/gzip"
"io"
"os"
)
func main() {
// Open the gzipped file
gzippedFile, err := os.Open("example.txt.gz")
if err != nil {
panic(err)
}
defer gzippedFile.Close()
// Create a new gzip reader
gzipReader, err := gzip.NewReader(gzippedFile)
defer gzipReader.Close()
// Create a new file to hold the uncompressed data
uncompressedFile, err := os.Create("example.txt")
if err != nil {
panic(err)
}
defer uncompressedFile.Close()
// Copy the contents of the gzip reader to the new file
_, err = io.Copy(uncompressedFile, gzipReader)
if err != nil {
panic(err)
}
}
تابع Open بسته os فایل gzip را باز می کند و تابع NewReader بسته gzip فایل فشرده شده را می خواند. تابع Create بسته os یک فایل متنی جدید ایجاد می کند. تابع Copy محتویات gzipReader را در فایل فشرده نشده کپی می کند.
فشرده سازی و از حالت فشرده سازی داده ها با Zlib
Zlib یک کتابخانه برای فشرده سازی و رفع فشرده سازی داده ها است. این کتابخانه همچنین از الگوریتم LZ77 استفاده می کند. Zlib به زبان C نوشته شده است و به طور گسترده ای به عنوان پایه دیگر کتابخانه ها و نرم افزارهای فشرده سازی استفاده می شود. برخلاف gzip، zlib یک کتابخانه است و zlib شامل فرمت فایل نیست. با این حال، اغلب برای فشرده سازی داده های ذخیره شده در قالب های کانتینری، مانند PNG یا HTTP استفاده می شود.
فرآیند فشرده سازی با zlib مانند gzip است. شما یک فایل zlib ایجاد می کنید، یک رایتر را پیکربندی می کنید، فایل اصلی را باز می کنید و محتویات را در فایل فشرده کپی می کنید.
import (
"compress/zlib"
"io"
"os"
)
func main() {
// Create a new file "example.zlib"
file, err := os.Create("example.zlib")
// If error occurs, panic and stop the program
if err != nil {
panic(err)
}
// Ensure that the file is closed after the function returns
defer file.Close()
// Create a new zlib writer with the best compression level
writer, err := zlib.NewWriterLevel(file, zlib.BestCompression)
// If error occurs, panic and stop the program
if err != nil {
panic(err)
}
// Ensure that the writer is closed after the function returns
defer writer.Close()
// Open the input file "example.txt"
inputFile, err := os.Open("example.txt")
// If error occurs, panic and stop the program
if err != nil {
panic(err)
}
// Ensure that the input file is closed after the function returns
defer inputFile.Close()
// Copy the contents of the input file to the writer
io.Copy(writer, inputFile)
}
متد Create فایل zlib را ایجاد می کند و تابع NewWriterLevel یک رایتر برای فایل با گزینه مشخص شده (در این مورد گزینه BestCompression) ایجاد می کند. روش Open بسته os فایل متنی را باز می کند و تابع Copy بسته io محتوای فایل متنی را در فایل zlib در فرآیند فشرده سازی کپی می کند.
برای فشرده سازی فایل zlib، باید فایل فشرده را باز کنید، یک zlib reader جدید ایجاد کنید و در نهایت محتوای خواننده را در خروجی استاندارد کپی کنید.
import (
"compress/zlib"
"io"
"os"
)
func main() {
// Open the compressed file "compressed_file.zlib"
file, err := os.Open("compressed_file.zlib")
// If error occurs, panic and stop the program
if err != nil {
panic(err)
}
// Ensure that the file is closed after the function returns
defer file.Close()
// Create a new zlib reader for the compressed file
reader, err := zlib.NewReader(file)
// If error occurs, panic and stop the program
if err != nil {
panic(err)
}
// Ensure that the reader is closed after the function returns
defer reader.Close()
// Copy the contents of the reader to the standard output
io.Copy(os.Stdout, reader)
}
تابع اصلی فایل zlib را با تابع Open بسته os باز می کند و تابع NewReader بسته zlib فایل zlib را در یک نمونه خواننده می خواند. روش Copy بسته io محتوا را از خواننده به خروجی استاندارد (در این مورد، کنسول) کپی می کند.
از این ابزارها برای فشرده سازی فایل استفاده کنید
نوشتن کد برای فشرده سازی فایل برای خودکار کردن وظایف و فشرده سازی چندین فایل مفید است. اگر فقط به فشرده سازی چند فایل نیاز دارید، می توانید از برنامه هایی مانند WinRar، WinZip، Express Zip و Bandizip استفاده کنید.