Làm việc với kho lưu trữ trong Go

Lưu trữ tập hợp nhiều tệp lại với nhau thành một định dạng duy nhất, thường là zip, tar hoặc rar. Các tệp lưu trữ cũng có thể sử dụng tính năng nén để giảm tổng kích thước tệp.


Bạn có thể sử dụng kho lưu trữ để phân phối phần mềm và dữ liệu, bao gồm cả các trang web. Bạn cũng có thể lưu trữ ứng dụng của mình, với tất cả các tệp và phần phụ thuộc của nó, để người dùng tải xuống và cài đặt.

Gói lưu trữ của Go cho phép bạn tạo và trích xuất các tệp lưu trữ ở định dạng tar và zip.


Gói lưu trữ của Go

đi cung cấp lưu trữ các gói để làm việc với các định dạng lưu trữ khác nhau. Bạn có thể dùng khóa kéohắc ín các gói để tạo, đọc và ghi các tệp lưu trữ ở các định dạng đó. Cả hai gói đều hỗ trợ các thuật toán nén khác nhau qua API dễ sử dụng.

Đây là cách bạn có thể nhập các gói zip và tar trong tệp Go của mình:

 import (
    "archive/zip"
    "archive/tar"
)

Sau khi nhập các gói, bạn có thể sử dụng chúng để tạo và thao tác các tệp lưu trữ.

Tạo và thêm tệp vào kho lưu trữ Tar

Các hắc ín gói hoạt động với kho lưu trữ tar của định dạng tar và tar.gz, bao gồm hỗ trợ đọc và ghi tệp có tiêu đề mở rộng PAX.

Gói tar cung cấp một Người viết mới chức năng tạo kho lưu trữ tar mới. NewWriter nhận một io.Writer thể hiện giao diện có thể là một tệp hoặc bộ nhớ đệm và trả về một con trỏ tới tar.Writer cấu trúc.

 package main
import (
    "archive/tar"
    "os"
)


func main() {
    
    file, _ := os.Create("myarchive.tar")
    defer file.Close()


    
    tarWriter := tar.NewWriter(file)
    defer tarWriter.Close()
}


Các Tạo nên chức năng của hệ điều hành gói tạo một tệp tar mới. Các tar.NewWriter chức năng nhận một tệp và tạo một kho lưu trữ mới.

Bạn có thể thêm tệp vào kho lưu trữ tar bằng Viết tiêu đềViết chức năng. Hàm WriteHeader nhận một tar.Header struct làm đối số. Phần này chứa siêu dữ liệu của tệp, chẳng hạn như tên tệp, kích thước và bit quyền. Hàm Write ghi nội dung của tệp vào kho lưu trữ.

 import (
    "archive/tar"
    "fmt"
    "io"
    "log"
    "os"
)
func main() {
   
   file, _ := os.Create("myarchive.tar")
   file, _ = os.Create("message.txt")
   defer file.Close()


   
   tarWriter := tar.NewWriter(file)
   defer tarWriter.Close()


   
   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")
}


Chương trình tạo các tệp tar và văn bản mới với Tạo nên chức năng của hệ điều hành gói và một kho lưu trữ tar mới với Người viết mớitrước khi thêm tệp vào kho lưu trữ.

Các Mở chức năng mở tệp để thêm vào kho lưu trữ. Lưu ý rằng bạn sẽ cần một tệp có tên tệp1.txt trong thư mục làm việc của bạn để chạy chương trình này thành công.

Bạn có thể dùng thống kê chức năng của phiên bản tệp để tìm nạp siêu dữ liệu bạn cần cho tiêu đề tar. Truyền kết quả của nó cho FileInfoHeadersau đó chuyển kết quả đó cho các Viết tiêu đề chức năng thiết lập tệp tar. Cuối cùng, sao chép tệp vào kho lưu trữ bằng cách sử dụng io.Copy.

kết quả của hoạt động lưu trữ tar

Bạn có thể dùng Trình đọc mới chức năng đọc nội dung của tệp lưu trữ tar. Chức năng NewReader nhận một io.Reader giao diện có thể là một tập tin hoặc một bộ đệm bộ nhớ. Nó trả về một con trỏ tới một tar.Reader cấu trúc.

 import (
    "archive/tar"
    "io"
    "os"
)
func main() {
    
    file, _ := os.Open("myarchive.tar")
    defer file.Close()


    
    tarReader := tar.NewReader(file)


    
    for {
        header, err := tarReader.Next()


        if err == io.EOF {
            break
        }


        
        outFile, _ := os.Create(header.Name)
        defer outFile.Close()
        _, _ = io.Copy(outFile, tarReader)
    }
}


Vòng lặp for vô hạn đi qua phiên bản trình đọc tar và trích xuất các tệp bằng cách sao chép từng tệp bằng io gói của Sao chép chức năng.

Tạo và thêm tệp vào kho lưu trữ Zip

Bạn có thể tạo một kho lưu trữ zip mới với Người viết mới chức năng của khóa kéo bưu kiện. Hàm NewWriter lấy một phiên bản tệp và trả về một trình ghi mã zip.

 import (
    "archive/zip"
    "os"
)
func main() {
    
    file, err := os.Create("archive.zip")


    if err != nil {
        panic(err)
    }


    defer file.Close()


    
    zipWriter := zip.NewWriter(file)
    defer zipWriter.Close()
}


Các zipWriter biến lưu trữ một biến mới nhà văn ví dụ mà NewWriter trả về.

Bạn có thể thêm tệp vào kho lưu trữ zip của mình bằng Tạo nên chức năng của cá thể Writer. Hàm Tạo lấy tên tệp. Bạn cũng có thể sử dụng Viết chức năng của phiên bản tệp zip để ghi dữ liệu vào tệp trong kho lưu trữ zip.

 import (
    "archive/zip"
    "os"
)
func main() {
    
    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()


    
    zipWriter := zip.NewWriter(file)
    defer zipWriter.Close()


    
    file1, err := zipWriter.Create("file1.txt")


    if err != nil {
        panic(err)
    }


    file2, err := zipWriter.Create("file2.txt")


    if err != nil {
        panic(err)
    }


    
    file1.Write([]byte("Hello, World!"))
    file2.Write([]byte("Goodbye, World!"))
    fmt.Println("zip archiving operation completed")
}


Chức năng chính bắt đầu bằng cách sử dụng Tạo nên để tạo một tệp zip mới và hai tệp văn bản. Sau đó, nó tạo hai Nhà văn để thêm hai tệp văn bản vào kho lưu trữ. Các Viết chức năng của từng phiên bản tệp ghi thông báo cho từng tệp trong kho lưu trữ.

kết quả từ hoạt động lưu trữ zip-

Bạn có thể giải nén một tệp zip hiện có bằng cách đọc nó với Trình đọc mở chức năng, sau đó lặp qua nội dung của nó và sao chép tệp bằng io bưu kiện.

 import (
    "archive/zip"
    "fmt"
    "io"
    "os"
)
func main() {
    
    zipReader, err := zip.OpenReader("archive.zip")


    if err != nil {
        panic(err)
    }


    defer zipReader.Close()


    
    for _, file := range zipReader.File {
        zippedFile, err := file.Open()


        if err != nil {
            panic(err)
        }


        defer zippedFile.Close()


        
        extractedFile, err := os.Create(file.Name)


        if err != nil {
            panic(err)
        }


        defer extractedFile.Close()


        
        _, err = io.Copy(extractedFile, zippedFile)


        if err != nil {
            panic(err)
        }


        fmt.Printf("Extracted %sn", file.Name)
    }
}


Các Trình đọc mở chức năng đọc lưu trữ zip. Các Trình đọc mở hàm chấp nhận tên tệp zip làm đối số và trả về phiên bản trình đọc tệp zip. Các cho phạm vi vòng lặp đi qua nội dung của các tệp trong phiên bản trình đọc. Nó tạo một tệp mới có cùng tên với tệp gốc và sao chép nội dung của tệp đã giải nén sang tệp mới bằng cách sử dụng lệnh io.Copy chức năng.

Giải nén theo cách thủ công hoặc theo chương trình—Tùy bạn

Giải nén tệp theo chương trình sẽ thuận tiện nếu bạn có nhiều tệp hoặc tài liệu lưu trữ cần giải nén. Bạn cũng có thể đang tích hợp chức năng lưu trữ vào ứng dụng chính của mình.

Trong các trường hợp khác, bạn nên sử dụng các ứng dụng hiện có. Bạn có thể sử dụng các ứng dụng tích hợp sẵn hoặc của bên thứ ba để giải nén tệp lưu trữ trên Windows, macOS và Linux.

Previous Post
Next Post

post written by: