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 hướng dẫn 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-zip
và 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:
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 không đồng bộ để 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 tất, 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.
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.
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
.