از کتابخانه آرشیو Go برای استخراج فایل های فشرده یا ایجاد فایل های خود استفاده کنید.
آرشیوها چندین فایل را با هم در یک فرمت واحد، معمولاً zip، tar، یا rar جمع میکنند. فایلهای آرشیو ممکن است از فشردهسازی برای کاهش حجم کل فایل استفاده کنند.
می توانید از آرشیوها برای توزیع نرم افزار و داده ها از جمله صفحات وب استفاده کنید. همچنین می توانید برنامه خود را با تمام فایل ها و وابستگی هایش برای دانلود و نصب کاربران بایگانی کنید.
بسته آرشیو Go به شما امکان می دهد آرشیوهایی را در قالب های tar و zip ایجاد و استخراج کنید.
بسته بایگانی Go
Go بسته های آرشیو را برای کار با فرمت های مختلف آرشیو فراهم می کند. می توانید از بسته های zip و tar برای ایجاد، خواندن و نوشتن فایل های آرشیو در آن فرمت ها استفاده کنید. هر دو بسته از الگوریتم های فشرده سازی مختلف بر روی یک API با استفاده آسان پشتیبانی می کنند.
در اینجا نحوه وارد کردن بسته های zip و tar در فایل های Go آمده است:
import (
"archive/zip"
"archive/tar"
)
پس از وارد کردن بسته ها، می توانید از آنها برای ایجاد و دستکاری فایل های آرشیو استفاده کنید.
ایجاد و افزودن فایل به آرشیو Tar
بسته tar با بایگانیهای tar از فرمتهای tar و tar.gz کار میکند، از جمله پشتیبانی از خواندن و نوشتن فایلها با هدرهای توسعهیافته PAX.
بسته tar یک تابع NewWriter برای ایجاد آرشیو تار جدید ارائه می دهد. NewWriter یک نمونه رابط io.Writer را می گیرد که ممکن است یک فایل یا بافر حافظه باشد و یک اشاره گر را به ساختار tar.Writer برمی گرداند.
package main
import (
"archive/tar"
"os"
)
func main() {
// Create a new file
file, _ := os.Create("myarchive.tar")
defer file.Close()
// Create a new tar archive
tarWriter := tar.NewWriter(file)
defer tarWriter.Close()
}
تابع Create بسته os یک فایل tar جدید ایجاد می کند. تابع tar.NewWriter یک فایل را می گیرد و یک آرشیو جدید ایجاد می کند.
با توابع WriteHeader و Write می توانید فایل ها را به آرشیو tar اضافه کنید. تابع WriteHeader یک ساختار tar.Header را به عنوان آرگومان می گیرد. این شامل ابرداده های فایل، مانند نام فایل، اندازه و بیت های مجوز است. تابع Write محتویات یک فایل را در آرشیو می نویسد.
import (
"archive/tar"
"fmt"
"io"
"log"
"os"
)
func main() {
// Create a new file
file, _ := os.Create("myarchive.tar")
file, _ = os.Create("message.txt")
defer file.Close()
// Create a new tar archive
tarWriter := tar.NewWriter(file)
defer tarWriter.Close()
// Add a file to the archive
fileToAdd, _ := os.Open("file1.txt")
defer fileToAdd.Close()
fileInfo, _ := fileToAdd.Stat()
header, _ := tar.FileInfoHeader(fileInfo, "")
tarWriter.WriteHeader(header)
_, _ = io.Copy(tarWriter, fileToAdd)
fmt.Println("TAR archive operation completed")
}
این برنامه قبل از افزودن فایل به بایگانی، فایلهای tar و متنی جدید را با تابع Create بسته os و یک آرشیو tar جدید با NewWriter ایجاد میکند.
تابع Open فایل را برای افزودن به آرشیو باز می کند. توجه داشته باشید که برای اجرای موفقیت آمیز این برنامه به فایلی به نام file1.txt در پوشه کاری خود نیاز دارید.
میتوانید از تابع Stat یک نمونه فایل برای واکشی ابردادهای که برای سربرگ tar نیاز دارید استفاده کنید. نتیجه آن را به FileInfoHeader ارسال کنید، سپس آن را به تابع WriteHeader ارسال کنید تا فایل tar تنظیم شود. در نهایت فایل را با استفاده از io.Copy در آرشیو کپی کنید.
استخراج فایل ها از آرشیو Tar
می توانید از تابع NewReader برای خواندن محتویات فایل آرشیو tar استفاده کنید. تابع NewReader یک رابط io.Reader می گیرد که ممکن است یک فایل یا یک بافر حافظه باشد. یک اشاره گر را به ساختار tar.Reader برمی گرداند.
import (
"archive/tar"
"io"
"os"
)
func main() {
// Open the tar archive
file, _ := os.Open("myarchive.tar")
defer file.Close()
// Create a new tar reader
tarReader := tar.NewReader(file)
// Iterate over the files in the archive
for {
header, err := tarReader.Next()
if err == io.EOF {
break
}
// Extract the file
outFile, _ := os.Create(header.Name)
defer outFile.Close()
_, _ = io.Copy(outFile, tarReader)
}
}
حلقه for بی نهایت نمونه tar reader را طی می کند و با کپی کردن هر فایل با تابع Copy بسته io، فایل ها را استخراج می کند.
ایجاد و افزودن فایل به آرشیو Zip
شما می توانید یک آرشیو فشرده جدید با تابع NewWriter بسته فشرده ایجاد کنید. تابع NewWriter یک نمونه فایل را می گیرد و یک فایل فشرده را برمی گرداند.
import (
"archive/zip"
"os"
)
func main() {
// Create a new file
file, err := os.Create("archive.zip")
if err != nil {
panic(err)
}
defer file.Close()
// Create a new zip writer
zipWriter := zip.NewWriter(file)
defer zipWriter.Close()
}
متغیر zipWriter یک نمونه Writer جدید را ذخیره می کند که NewWriter آن را برمی گرداند.
با استفاده از تابع Create نمونه Writer می توانید فایل ها را به آرشیو فشرده خود اضافه کنید. تابع Create نام فایل را می گیرد. همچنین میتوانید از تابع Write نمونه فایل فشرده برای نوشتن دادهها در فایلهای بایگانی فشرده استفاده کنید.
import (
"archive/zip"
"os"
)
func main() {
// Create new files
file, err := os.Create("archive.zip")
file, err = os.Create("file1.txt")
file, err = os.Create("file2.txt")
if err != nil {
panic(err)
}
defer file.Close()
// Create a new zip writer
zipWriter := zip.NewWriter(file)
defer zipWriter.Close()
// Add files to the archive
file1, err := zipWriter.Create("file1.txt")
if err != nil {
panic(err)
}
file2, err := zipWriter.Create("file2.txt")
if err != nil {
panic(err)
}
// Write data to the files in the archive
file1.Write([]byte("Hello, World!"))
file2.Write([]byte("Goodbye, World!"))
fmt.Println("zip archiving operation completed")
}
عملکرد اصلی با استفاده از Create برای ایجاد یک فایل فشرده جدید و دو فایل متنی شروع می شود. سپس دو Writer ایجاد می کند تا دو فایل متنی را به آرشیو اضافه کند. تابع Write هر نمونه فایل پیام هایی را برای هر یک از فایل های موجود در بایگانی می نویسد.
استخراج فایل ها از آرشیو های فشرده
میتوانید یک فایل فشرده موجود را با خواندن آن با تابع OpenReader استخراج کنید، سپس محتویات آن را حلقه بزنید و فایلها را با بسته io کپی کنید.
import (
"archive/zip"
"fmt"
"io"
"os"
)
func main() {
// Open the archive
zipReader, err := zip.OpenReader("archive.zip")
if err != nil {
panic(err)
}
defer zipReader.Close()
// Extract files from the archive
for _, file := range zipReader.File {
zippedFile, err := file.Open()
if err != nil {
panic(err)
}
defer zippedFile.Close()
// Create a new file with the same name as the zipped file
extractedFile, err := os.Create(file.Name)
if err != nil {
panic(err)
}
defer extractedFile.Close()
// Copy the data from the zipped file to the new file
_, err = io.Copy(extractedFile, zippedFile)
if err != nil {
panic(err)
}
fmt.Printf("Extracted %s\n", file.Name)
}
}
تابع OpenReader آرشیوهای فشرده را می خواند. تابع OpenReader نام فایل فشرده را به عنوان آرگومان می پذیرد و نمونه فایل خوان فایل فشرده را برمی گرداند. حلقه for-range از میان محتویات فایل ها در نمونه خواننده عبور می کند. یک فایل جدید با همان نام فایل اصلی ایجاد می کند و با استفاده از تابع io.Copy محتویات فایل استخراج شده را در فایل جدید کپی می کند.
زیپ را به صورت دستی یا برنامهریزی کنید – این به شما بستگی دارد
اگر فایلها یا آرشیوهای زیادی برای بازکردن دارید، باز کردن فایلها به صورت برنامهریزی راحت است. همچنین ممکن است عملکرد آرشیو را در برنامه اصلی خود ادغام کنید.
در موارد دیگر، ممکن است بهتر باشد از برنامه های موجود استفاده کنید. میتوانید از برنامههای داخلی یا شخص ثالث برای باز کردن بایگانیها در Windows، macOS و Linux استفاده کنید.