Cách làm việc với tệp Zip trong Node.js

Tác giả đã chọn Open Sourcing Mental Illness để nhận được một khoản đóng góp như một phần của chương trình Viết cho DO donate.

Giới thiệu

Làm việc với tệp là một trong những nhiệm vụ phổ biến giữa các nhà phát triển. Khi các tệp của bạn tăng kích thước, chúng bắt đầu chiếm dung lượng đáng kể trên ổ cứng của bạn. Sớm hay muộn, bạn có thể cần phải chuyển các tệp đến các máy chủ khác hoặc tải lên nhiều tệp từ máy cục bộ của bạn sang các nền tảng khác nhau. Một số nền tảng này có giới hạn kích thước tệp và sẽ không chấp nhận các tệp lớn. Để giải quyết vấn đề này, bạn có thể nhóm các tệp thành một tệp ZIP. Tệp ZIP là một định dạng lưu trữ đóng gói và nén các tệp với Nén không mất dữ liệu thuật toán. Thuật toán có thể tái tạo lại dữ liệu mà không làm mất dữ liệu. Trong Node.js, bạn có thể sử dụng adm-zip mô-đun để tạo và đọc các lưu trữ ZIP.

Trong này, bạn sẽ sử dụng adm-zip để nén, đọc và giải nén tệp. Đầu tiên, bạn sẽ kết hợp nhiều tệp thành một kho lưu trữ ZIP bằng cách sử dụng adm-zip. Sau đó, bạn sẽ liệt kê các nội dung lưu trữ ZIP. Sau đó, bạn sẽ thêm một tệp vào kho lưu trữ ZIP hiện có, và cuối cùng, bạn sẽ trích xuất tệp lưu trữ ZIP vào một thư mục.

Điều kiện tiên quyết

Để làm theo hướng dẫn này, bạn sẽ cần:

Bước 1 – Thiết lập dự án

Trong bước này, bạn sẽ tạo thư mục cho dự án của mình và cài đặt adm-zip như một sự phụ thuộc. Thư mục này là nơi bạn sẽ giữ các tệp chương trình của mình. Bạn cũng sẽ tạo một thư mục khác chứa các tệp văn bản và hình ảnh. Bạn sẽ lưu trữ thư mục này trong phần tiếp theo.

Tạo một thư mục có tên zip_app bằng lệnh sau:

Navigate into the newly created directory with the cd yêu cầu:

Inside the directory, create a package.json tệp để quản lý các phụ thuộc của dự án:

Các -y tùy chọn tạo ra một mặc định package.json tập tin.

Tiếp theo, cài đặt adm-zip với npm install yêu cầu:

After you run the command, npm sẽ cài đặt adm-zip và cập nhật package.json tập tin.

Tiếp theo, tạo một thư mục có tên test và chuyển vào đó:

In this directory, you will create three text files and download an image. The three files will be filled with dummy content to make their file sizes larger. This will help to demonstrate ZIP compression when you archive this directory.

Create the file1.txt và điền vào nó bằng nội dung giả bằng lệnh sau:

  • yes "dummy content" | head -n 100000 > file1.txt

Các yes lệnh ghi nhật ký chuỗi dummy content nhiều lần. Sử dụng lệnh pipe |, bạn gửi đầu ra từ yes lệnh được sử dụng làm đầu vào cho head yêu cầu. Các head lệnh in một phần của đầu vào đã cho vào đầu ra chuẩn. Các -n tùy chọn chỉ định số dòng sẽ được ghi vào đầu ra tiêu chuẩn. Cuối cùng, bạn chuyển hướng head xuất ra một tệp mới file1.txt sử dụng >.

Tạo tệp thứ hai với chuỗi “nội dung giả” lặp lại 300.000 dòng:

  • yes "dummy content" | head -n 300000 > file2.txt

Tạo một tệp khác với dummy content chuỗi lặp lại 600.000 dòng:

  • yes "dummy content" | head -n 600000 > file3.txt

Cuối cùng, tải một hình ảnh vào thư mục bằng cách sử dụng curl:

  • curl -O https://assets.digitalocean.com/how-to-process-images-in-node-js-with-sharp/underwater.png

Di chuyển trở lại thư mục dự án chính bằng lệnh sau:

Các .. sẽ chuyển bạn đến thư mục mẹ, đó là zip_app.

Bây giờ bạn đã tạo thư mục dự án, đã cài đặt adm-zipvà tạo một thư mục với các tệp để lưu trữ. Trong bước tiếp theo, bạn sẽ lưu trữ một thư mục bằng cách sử dụng adm-zip mô-đun.

Bước 2 - Tạo kho lưu trữ ZIP

Trong bước này, bạn sẽ sử dụng adm-zip để nén và lưu trữ thư mục bạn đã tạo trong phần trước.

Để lưu trữ thư mục, bạn sẽ nhập adm-zip mô-đun và sử dụng mô-đun của addLocalFolder() phương pháp để thêm thư mục vào adm-zip đối tượng ZIP của mô-đun. Sau đó, bạn sẽ sử dụng mô-đun của writeZip() phương pháp để lưu kho lưu trữ trong hệ thống cục bộ của bạn.

Tạo và mở một tệp mới createArchive.js trong trình soạn thảo văn bản ưa thích của bạn. Hướng dẫn này sử dụng nano, một trình soạn thảo văn bản dòng lệnh:

Next, require in the adm-zip mô-đun trong của bạn createArchive.js tập tin:

Xem tiếp:   Cách tự động khởi động lại ứng dụng Node.js của bạn với gật gù

zip_app / createArchive.js

const AdmZip = require("adm-zip");

Các adm-zip mô-đun cung cấp một lớp có chứa các phương thức để tạo các kho lưu trữ ZIP.

Vì thường gặp các tệp lớn trong quá trình lưu trữ, bạn có thể sẽ chặn luồng chính cho đến khi lưu trữ ZIP. Để viết mã không chặn, bạn sẽ xác định một hàm để tạo và lưu tệp nén ZIP.

Trong của bạn createArchive.js tệp, thêm mã được đánh dấu sau:

zip_app / createArchive.js


const AdmZip = require("adm-zip");

async function createZipArchive() {
  const zip = new AdmZip();
  const outputFile = "test.zip";
  zip.addLocalFolder("./test");
  zip.writeZip(outputFile);
  console.log(`Created ${outputFile} successfully`);
}

createZipArchive();

createZipArchive là một chức năng không đồng bộ tạo ra một kho lưu trữ ZIP từ một thư mục nhất định. Điều làm cho nó không đồng bộ là async từ khóa bạn đã xác định trước nhãn hàm. Trong hàm, bạn tạo một phiên bản của adm-zip mô-đun này cung cấp các phương pháp bạn có thể sử dụng để đọc và tạo tài liệu lưu trữ. Khi bạn tạo một phiên bản, adm-zip tạo một tệp ZIP trong bộ nhớ nơi bạn có thể thêm tệp hoặc thư mục.

Tiếp theo, bạn xác định tên kho lưu trữ và lưu trữ nó trong outputDir Biến đổi. Để thêm test thư mục vào kho lưu trữ trong bộ nhớ, bạn gọi addLocalFolder() phương pháp từ adm-zip với đường dẫn thư mục làm đối số.

Sau khi thư mục được thêm vào, bạn gọi writeZip() phương pháp từ adm-zip với một biến chứa tên của kho lưu trữ ZIP. Các writeZip() phương pháp lưu kho lưu trữ vào đĩa cục bộ của bạn.

Sau khi hoàn , bạn gọi console.log() để ghi rằng tệp ZIP đã được tạo thành công.

Cuối cùng, bạn gọi createZipArchive() chức năng.

Trước khi bạn chạy tệp, hãy bọc mã trong một cố gắng bắt khối để xử lý lỗi thời gian chạy:

zip_app / createArchive.js

const AdmZip = require("adm-zip");

async function createZipArchive() {
  try {
    const zip = new AdmZip();
    const outputFile = "test.zip";
    zip.addLocalFolder("./test");
    zip.writeZip(outputFile);
    console.log(`Created ${outputFile} successfully`);
  } catch (e) {
    console.log(`Something went wrong. ${e}`);
  }
}

createZipArchive();

Trong try khối, mã sẽ cố gắng tạo một kho lưu trữ ZIP. Nếu thành công, createZipArchive() chức năng sẽ thoát, bỏ qua catch khối. Nếu việc tạo tệp lưu trữ ZIP gây ra lỗi, quá trình thực thi sẽ bỏ qua catch chặn và ghi lại lỗi trong bảng điều khiển.

Lưu và thoát tệp trong nano với CTRL+X. đi vào y để lưu các thay đổi và xác nhận tệp bằng cách nhấn ENTER trên Windows hoặc RETURN trên máy Mac.

Chạy createArchive.js tập tin bằng cách sử dụng node yêu cầu:

You'll receive the following output:

Output

Created test.zip successfully

Liệt kê nội dung thư mục để xem liệu tệp nén ZIP đã được tạo chưa:

You'll receive the following output showing the archive among the contents:

Output

createArchive.js node_modules package-lock.json package.json test test.zip

Với xác nhận rằng tệp lưu trữ ZIP đã được tạo, bạn sẽ so sánh tệp lưu trữ ZIP và test kích thước tệp thư mục để xem liệu nén có hoạt động hay không.

Kiểm tra test kích thước thư mục bằng cách sử dụng du yêu cầu:

Các -h cờ hướng dẫn du để hiển thị kích thước thư mục ở định dạng con người có thể đọc được.

Sau khi chạy lệnh, bạn sẽ nhận được kết quả sau:

Output

15M test

Tiếp theo, hãy kiểm tra test.zip kích thước tệp lưu trữ:

Các du lệnh ghi lại kết quả đầu ra sau:

Output

760K test.zip

Như bạn có thể thấy, việc tạo tệp ZIP đã giảm kích thước thư mục từ 15 Megabyte (MB) xuống còn 760 Kilobyte (KB), đây là một sự khác biệt rất lớn. Tệp ZIP di động hơn và có kích thước nhỏ hơn.

Bây giờ bạn đã tạo một kho lưu trữ ZIP, bạn đã sẵn sàng để liệt kê nội dung trong một tệp ZIP.

Bước 3 - Liệt kê tệp trong kho lưu trữ ZIP

Trong bước này, bạn sẽ đọc và liệt kê tất cả các tệp trong kho lưu trữ ZIP bằng cách sử dụng adm-zip. Để làm điều đó, bạn sẽ khởi tạo adm-zip mô-đun với đường dẫn lưu trữ ZIP của bạn. Sau đó, bạn sẽ gọi mô-đun của getEntries() phương thức trả về một mảng đối tượng. Mỗi đối tượng chứa thông tin quan trọng về một mục trong kho lưu trữ ZIP. Để liệt kê các tệp, bạn sẽ lặp lại mảng và truy cập vào tên tệp từ đối tượng và đăng nhập nó trong bảng điều khiển.

Xem tiếp:   Hướng dẫn cài đặt LEMP stack trên Ubuntu 20.04

Tạo và mở readArchive.js trong trình soạn thảo văn bản yêu thích của bạn:

Trong của bạn readArchive.js, thêm mã sau để đọc và liệt kê nội dung trong kho lưu trữ ZIP:

zip_app / readArchive.js

const AdmZip = require("adm-zip");

async function readZipArchive(filepath) {
  try {
    const zip = new AdmZip(filepath);

    for (const zipEntry of zip.getEntries()) {
      console.log(zipEntry.toString());
    }
  } catch (e) {
    console.log(`Something went wrong. ${e}`);
  }
}

readZipArchive("./test.zip");

Đầu tiên, bạn yêu cầu trong adm-zip mô-đun.

Tiếp theo, bạn xác định readZipArchive() hàm, là một hàm không đồng bộ. Trong hàm, bạn tạo một phiên bản của adm-zip với đường dẫn của tệp ZIP bạn muốn đọc. Đường dẫn tệp được cung cấp bởi filepath tham số. adm-zip sẽ đọc tệp và phân tích cú pháp.

Sau khi đọc kho lưu trữ, bạn xác định một for....of câu lệnh lặp qua các đối tượng trong một mảng mà getEntries() phương pháp từ adm-zip trả về khi được gọi. Trên mỗi lần lặp, đối tượng được gán cho zipEntry Biến đổi. Bên trong vòng lặp, bạn chuyển đổi đối tượng thành một chuỗi đại diện cho đối tượng bằng cách sử dụng Node.js toString() , sau đó đăng nhập nó vào bảng điều khiển bằng cách sử dụng console.log() phương pháp.

Cuối cùng, bạn gọi readZipArchive() hàm với đường dẫn tệp lưu trữ ZIP làm đối số.

Lưu và thoát khỏi tệp của bạn, sau đó chạy tệp bằng lệnh sau:

You will get output that resembles the following(edited for brevity):

Output

{ "entryName": "file1.txt", "name": "file1.txt", "comment": "", "isDirectory": false, "header": { ... }, "compressedData": "<27547 bytes buffer>", "data": "<null>" } ...

Bảng điều khiển sẽ ghi bốn đối tượng. Các đối tượng khác đã được chỉnh sửa để giữ cho hướng dẫn ngắn gọn.

Mỗi tệp trong kho lưu trữ được biểu diễn bằng một đối tượng tương tự như đối tượng trong đầu ra trước đó. Để lấy tên tệp cho mỗi tệp, bạn cần truy cập vào name bất động sản.

Trong của bạn readArchive.js tệp, hãy thêm mã được đánh dấu sau để truy cập từng tên tệp:

zip_app / readArchive.js

const AdmZip = require("adm-zip");

async function readZipArchive(filepath) {
  try {
    const zip = new AdmZip(filepath);

    for (const zipEntry of zip.getEntries()) {
      console.log(zipEntry.name);
    }
  } catch (e) {
    console.log(`Something went wrong. ${e}`);
  }
}

readZipArchive("./test.zip");

Lưu và thoát khỏi trình soạn thảo văn bản của bạn. Bây giờ, hãy chạy lại tệp với node yêu cầu:

Running the file results in the following output:

Output

file1.txt file2.txt file3.txt underwater.png

Đầu ra bây giờ ghi lại tên tệp của mỗi tệp trong kho lưu trữ ZIP.

Giờ đây, bạn có thể đọc và liệt kê từng tệp trong kho lưu trữ ZIP. Trong phần tiếp theo, bạn sẽ thêm tệp vào kho lưu trữ ZIP hiện có.

Bước 4 - Thêm tệp vào kho lưu trữ hiện có

Trong bước này, bạn sẽ tạo một tệp và thêm nó vào kho lưu trữ ZIP mà bạn đã tạo trước đó mà không cần giải nén. Trước tiên, bạn sẽ đọc kho lưu trữ ZIP bằng cách tạo adm-zip ví dụ. Thứ hai, bạn sẽ gọi mô-đun của addFile() để thêm tệp vào ZIP. Cuối cùng, bạn sẽ lưu tệp nén ZIP trong hệ thống cục bộ.

Tạo một tệp khác file4.txt với nội dung giả lặp lại 600.000 dòng:

  • yes "dummy content" | head -n 600000 > file4.txt

Tạo và mở updateArchive.js trong trình soạn thảo văn bản của bạn:

Require in the adm-zip mô-đun và fs mô-đun cho phép bạn làm việc với các tệp trong updateArchive.js tập tin:

const AdmZip = require("adm-zip");
const fs = require("fs").promises;

Bạn yêu cầu trong phiên bản dựa trên lời hứa của fs phiên bản mô-đun, cho phép bạn viết mã không đồng bộ. Khi bạn gọi một fs , nó sẽ trả về một lời hứa.

Tiếp theo trong của bạn updateArchive.js tệp, hãy thêm mã được đánh dấu sau để thêm tệp mới vào kho lưu trữ ZIP:

zip_app / updateArchive.js

const AdmZip = require("adm-zip");
const fs = require("fs").promises;

async function updateZipArchive(filepath) {
  try {
    const zip = new AdmZip(filepath);

    content = await fs.readFile("./file4.txt");
    zip.addFile("file4.txt", content);
    zip.writeZip(filepath);
    console.log(`Updated ${filepath} successfully`);
  } catch (e) {
    console.log(`Something went wrong. ${e}`);
  }
}

updateZipArchive("./test.zip");

updateZipArchive là một chức năng không đồng bộ đọc một tệp trong hệ thống tệp và thêm nó vào một tệp ZIP hiện có. Trong hàm, bạn tạo một phiên bản của adm-zip với đường dẫn tệp lưu trữ ZIP trong filepath như một tham số. Tiếp theo, bạn gọi fs của mô-đun readFile() để đọc tệp trong hệ thống tệp. Các readFile() phương thức trả về một lời hứa mà bạn giải quyết bằng await từ khóa (await chỉ hợp lệ trong các hàm không đồng bộ). Sau khi được giải quyết, phương thức trả về đệm đối tượng chứa nội dung tệp.

Xem tiếp:   Cách xây dựng máy chủ Hashicorp Vault bằng cách sử dụng Packer và Terraform trên DigitalOcean

Tiếp theo, bạn gọi addFile() phương pháp từ adm-zip. Phương thức này có hai đối số. Đối số đầu tiên là tên tệp bạn muốn thêm vào kho lưu trữ và đối số thứ hai là đối tượng đệm chứa nội dung của tệp mà readFile() phương thức đọc.

Sau đó, bạn gọi adm-zip của mô-đun writeZip() phương pháp để lưu và ghi các thay đổi mới trong kho lưu trữ ZIP. Sau khi hoàn tất, bạn gọi console.log() phương pháp ghi lại một thông báo thành công.

Cuối cùng, bạn gọi updateZipArchive() hàm với đường dẫn tệp lưu trữ Zip làm đối số.

Lưu và thoát khỏi tệp của bạn. Chạy updateArchive.js tệp bằng lệnh sau:

You'll see output like this:

Output

Updated ./test.zip successfully

Bây giờ, hãy xác nhận rằng kho lưu trữ ZIP có chứa tệp mới. Chạy readArchive.js để liệt kê nội dung trong kho lưu trữ ZIP bằng lệnh sau:

You'll receive the following output:

file1.txt
file2.txt
file3.txt
file4.txt
underwater.png

Điều này xác nhận rằng tệp đã được thêm vào ZIP.

Bây giờ bạn có thể thêm tệp vào kho lưu trữ hiện có, bạn sẽ giải nén tệp lưu trữ trong phần tiếp theo.

Trong bước này, bạn sẽ đọc và trích xuất tất cả nội dung trong kho lưu trữ ZIP vào một thư mục. Để giải nén một kho lưu trữ ZIP, bạn sẽ khởi tạo adm-zip với đường dẫn tệp lưu trữ. Sau đó, bạn sẽ gọi mô-đun của extractAllTo() với tên thư mục mà bạn muốn nội dung ZIP được trích xuất của bạn cư trú.

Tạo và mở extractArchive.js trong trình soạn thảo văn bản của bạn:

Require in the adm-zip mô-đun và path mô-đun trong của bạn extractArchive.js tập tin:

zip_app / extractArchive.js

const AdmZip = require("adm-zip");
const path = require("path");

Các path mô-đun cung cấp các phương pháp hữu ích để xử lý các đường dẫn tệp.

Vẫn trong của bạn extractArchive.js , hãy thêm mã được đánh dấu sau để trích xuất một kho lưu trữ:

zip_app / extractArchive.js

const AdmZip = require("adm-zip");
const path = require("path");

async function extractArchive(filepath) {
  try {
    const zip = new AdmZip(filepath);
    const outputDir = `${path.parse(filepath).name}_extracted`;
    zip.extractAllTo(outputDir);

    console.log(`Extracted to "${outputDir}" successfully`);
  } catch (e) {
    console.log(`Something went wrong. ${e}`);
  }
}

extractArchive("./test.zip");

extractArchive() là một hàm không đồng bộ nhận tham số chứa đường dẫn tệp của kho lưu trữ ZIP. Trong hàm, bạn khởi tạo adm-zip với đường dẫn tệp lưu trữ ZIP được cung cấp bởi filepath tham số.

Tiếp theo, bạn xác định một mẫu theo nghĩa đen. Bên trong chỗ dành sẵn theo nghĩa đen của mẫu (${}), bạn gọi parse() phương pháp từ path mô-đun với đường dẫn tệp. Các parse() phương thức trả về một đối tượng. Để lấy tên của tệp ZIP mà không có phần mở rộng tệp, bạn nối name tài sản cho đối tượng mà parse() phương thức trả về. Sau khi tên kho lưu trữ được trả về, khuôn mẫu sẽ nội suy giá trị với _extracted chuỗi. Giá trị sau đó được lưu trữ trong outputDir Biến đổi. Đây sẽ là tên của thư mục được giải nén.

Tiếp theo, bạn gọi adm-zip của mô-đun extractAllTo phương thức với tên thư mục được lưu trữ trong outputDir để trích xuất nội dung trong thư mục. Sau đó, bạn gọi console.log() để ghi lại một thông báo thành công.

Cuối cùng, bạn gọi extractArchive() chức năng với đường dẫn lưu trữ ZIP.

Lưu tệp của bạn và thoát khỏi trình chỉnh sửa, sau đó chạy extractArchive.js tệp bằng lệnh sau:

You receive the following output:

Output

Extracted to "test_extracted" successfully

Xác nhận rằng thư mục chứa nội dung ZIP đã được tạo:

You will receive the following output:

Output

createArchive.js file4.txt package-lock.json readArchive.js test.zip updateArchive.js extractArchive.js node_modules package.json test test_extracted

Bây giờ, điều hướng vào thư mục chứa nội dung được trích xuất:

List the contents in the directory:

You will receive the following output:

Output

file1.txt file2.txt file3.txt file4.txt underwater.png

Bây giờ bạn có thể thấy rằng thư mục có tất cả các tệp trong thư mục gốc.

Bây giờ bạn đã trích xuất nội dung lưu trữ ZIP vào một thư mục.

Sự kết luận

Trong hướng dẫn này, bạn đã tạo một kho lưu trữ ZIP, liệt kê nội dung của nó, thêm một tệp mới vào kho lưu trữ và trích xuất tất cả nội dung của nó vào một thư mục bằng cách sử dụng adm-zip mô-đun. Đây sẽ là nền tảng tốt để làm việc với các kho lưu trữ ZIP trong Node.js.

Để tìm hiểu thêm về adm-zip mô-đun, xem tài liệu adm-zip. Để tiếp tục xây dựng kiến ​​thức Node.js của bạn, hãy xem Cách viết mã trong loạt bài Node.js

.

Check Also

Cách thiết lập Nền tảng Eclipse Theia Cloud IDE trên DigitalOcean Kubernetes

Tác giả đã chọn Quỹ Nguồn mở và Miễn phí để nhận một khoản đóng …