خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

کار با Archives in Go

از کتابخانه آرشیو 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 یک فایل را می گیرد و یک آرشیو جدید ایجاد می کند.

مطلب مرتبط:   نحوه قالب‌بندی Go Source برای کد سازگارتر

با توابع 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، فایل ها را استخراج می کند.

مطلب مرتبط:   نحوه پیاده سازی پروتکل Open Graph در Next.js

ایجاد و افزودن فایل به آرشیو 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 استفاده کنید.