Skip to content

Commit 0a4e8ca

Browse files
Iterate over entries without storing their metadata
1 parent d7a748c commit 0a4e8ca

File tree

2 files changed

+68
-2
lines changed

2 files changed

+68
-2
lines changed

Diff for: adm-zip.js

+8
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,14 @@ module.exports = function (/*String*/input) {
339339
return getEntry(name);
340340
},
341341

342+
getEntryCount: function() {
343+
return _zip.getEntryCount();
344+
},
345+
346+
forEach: function(callback) {
347+
return _zip.forEach(callback);
348+
},
349+
342350
/**
343351
* Extracts the given entry to the given targetPath
344352
* If the entry is a directory inside the archive, the entire directory and it's subdirectories will be extracted

Diff for: zipFile.js

+60-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
99
filename = "",
1010
fs = Utils.FileSystem.require(),
1111
inBuffer = null,
12-
mainHeader = new Headers.MainHeader();
12+
mainHeader = new Headers.MainHeader(),
13+
loadedEntries = false;
1314

1415
if (inputType === Utils.Constants.FILE) {
1516
// is a filename
@@ -22,9 +23,28 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
2223
readMainHeader();
2324
} else {
2425
// none. is a new file
26+
loadedEntries = true;
27+
}
28+
29+
function iterateEntries(callback) {
30+
const totalEntries = mainHeader.diskEntries; // total number of entries
31+
let index = mainHeader.offset; // offset of first CEN header
32+
33+
for (let i = 0; i < totalEntries; i++) {
34+
let tmp = index;
35+
const entry = new ZipEntry(inBuffer);
36+
37+
entry.header = inBuffer.slice(tmp, tmp += Utils.Constants.CENHDR);
38+
entry.entryName = inBuffer.slice(tmp, tmp += entry.header.fileNameLength);
39+
40+
index += entry.header.entryHeaderSize;
41+
42+
callback(entry);
43+
}
2544
}
2645

2746
function readEntries() {
47+
loadedEntries = true;
2848
entryTable = {};
2949
entryList = new Array(mainHeader.diskEntries); // total number of entries
3050
var index = mainHeader.offset; // offset of first CEN header
@@ -90,7 +110,7 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
90110
if (mainHeader.commentLength) {
91111
_comment = inBuffer.slice(commentEnd + Utils.Constants.ENDHDR);
92112
}
93-
readEntries();
113+
// readEntries();
94114
}
95115

96116
return {
@@ -99,6 +119,9 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
99119
* @return Array
100120
*/
101121
get entries() {
122+
if (!loadedEntries) {
123+
readEntries();
124+
}
102125
return entryList;
103126
},
104127

@@ -114,13 +137,33 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
114137
_comment = val;
115138
},
116139

140+
getEntryCount: function() {
141+
if (!loadedEntries) {
142+
return mainHeader.diskEntries;
143+
}
144+
145+
return entryList.length;
146+
},
147+
148+
forEach: function(callback) {
149+
if (!loadedEntries) {
150+
iterateEntries(callback);
151+
return;
152+
}
153+
154+
entryList.forEach(callback);
155+
},
156+
117157
/**
118158
* Returns a reference to the entry with the given name or null if entry is inexistent
119159
*
120160
* @param entryName
121161
* @return ZipEntry
122162
*/
123163
getEntry: function (/*String*/entryName) {
164+
if (!loadedEntries) {
165+
readEntries();
166+
}
124167
return entryTable[entryName] || null;
125168
},
126169

@@ -130,6 +173,9 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
130173
* @param entry
131174
*/
132175
setEntry: function (/*ZipEntry*/entry) {
176+
if (!loadedEntries) {
177+
readEntries();
178+
}
133179
entryList.push(entry);
134180
entryTable[entry.entryName] = entry;
135181
mainHeader.totalEntries = entryList.length;
@@ -142,6 +188,9 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
142188
* @param entryName
143189
*/
144190
deleteEntry: function (/*String*/entryName) {
191+
if (!loadedEntries) {
192+
readEntries();
193+
}
145194
var entry = entryTable[entryName];
146195
if (entry && entry.isDirectory) {
147196
var _self = this;
@@ -163,6 +212,9 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
163212
* @return Array
164213
*/
165214
getEntryChildren: function (/*ZipEntry*/entry) {
215+
if (!loadedEntries) {
216+
readEntries();
217+
}
166218
if (entry.isDirectory) {
167219
var list = [],
168220
name = entry.entryName,
@@ -184,6 +236,9 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
184236
* @return Buffer
185237
*/
186238
compressToBuffer: function () {
239+
if (!loadedEntries) {
240+
readEntries();
241+
}
187242
if (entryList.length > 1) {
188243
entryList.sort(function (a, b) {
189244
var nameA = a.entryName.toLowerCase();
@@ -258,6 +313,9 @@ module.exports = function (/*String|Buffer*/input, /*Number*/inputType) {
258313
},
259314

260315
toAsyncBuffer: function (/*Function*/onSuccess, /*Function*/onFail, /*Function*/onItemStart, /*Function*/onItemEnd) {
316+
if (!loadedEntries) {
317+
readEntries();
318+
}
261319
if (entryList.length > 1) {
262320
entryList.sort(function (a, b) {
263321
var nameA = a.entryName.toLowerCase();

0 commit comments

Comments
 (0)