我正在構建一個應用程序,它需要在不提取文件的情況下讀取zip文件內的文件。有沒有這種功能的圖書館,或者你能給我一些關於如何解決它的想法嗎?是否可以在不提取Objective-C文件的情況下讀取壓縮文件?
1
A
回答
2
您可以一次解壓縮一個數據緩衝區,然後通讀它,假定文件是文本,並且可以用增量方式解析它(例如,用於處理的XML數據一個SAX解析器)。
這是我寫的一個例程,它從zip-stream中提取數據,並一次打印出一行。您可以修改它來打印或解析N
字符。或者你可以將行添加到行緩衝區,並且一次處理/解析一大塊行。
這使用zlib
,如果這個代碼是對你有用,可隨時使用它:
#
# compile with -lz option in order to link in the zlib library
#
#include <zlib.h>
#define Z_CHUNK 2097152
int unzipFile(const char *fName)
{
z_stream zStream;
char *zRemainderBuf = malloc(1);
unsigned char zInBuf[Z_CHUNK];
unsigned char zOutBuf[Z_CHUNK];
char zLineBuf[Z_CHUNK];
unsigned int zHave, zBufIdx, zBufOffset, zOutBufIdx;
int zError;
FILE *inFp = fopen(fName, "rbR");
if (!inFp) { fprintf(stderr, "could not open file: %s\n", fName); return EXIT_FAILURE; }
zStream.zalloc = Z_NULL;
zStream.zfree = Z_NULL;
zStream.opaque = Z_NULL;
zStream.avail_in = 0;
zStream.next_in = Z_NULL;
zError = inflateInit2(&zStream, (15+32)); /* cf. http://www.zlib.net/manual.html */
if (zError != Z_OK) { fprintf(stderr, "could not initialize z-stream\n"); return EXIT_FAILURE; }
*zRemainderBuf = '\0';
do {
zStream.avail_in = fread(zInBuf, 1, Z_CHUNK, inFp);
if (zStream.avail_in == 0)
break;
zStream.next_in = zInBuf;
do {
zStream.avail_out = Z_CHUNK;
zStream.next_out = zOutBuf;
zError = inflate(&zStream, Z_NO_FLUSH);
switch (zError) {
case Z_NEED_DICT: { fprintf(stderr, "Z-stream needs dictionary!\n"); return EXIT_FAILURE; }
case Z_DATA_ERROR: { fprintf(stderr, "Z-stream suffered data error!\n"); return EXIT_FAILURE; }
case Z_MEM_ERROR: { fprintf(stderr, "Z-stream suffered memory error!\n"); return EXIT_FAILURE; }
}
zHave = Z_CHUNK - zStream.avail_out;
zOutBuf[zHave] = '\0';
/* copy remainder buffer onto line buffer, if not NULL */
if (zRemainderBuf) {
strncpy(zLineBuf, zRemainderBuf, strlen(zRemainderBuf));
zBufOffset = strlen(zRemainderBuf);
}
else
zBufOffset = 0;
/* read through zOutBuf for newlines */
for (zBufIdx = zBufOffset, zOutBufIdx = 0; zOutBufIdx < zHave; zBufIdx++, zOutBufIdx++) {
zLineBuf[zBufIdx] = zOutBuf[zOutBufIdx];
if (zLineBuf[zBufIdx] == '\n') {
zLineBuf[zBufIdx] = '\0';
zBufIdx = -1;
fprintf(stdout, "%s\n", zLineBuf);
}
}
/* copy some of line buffer onto the remainder buffer, if there are remnants from the z-stream */
if (strlen(zLineBuf) > 0) {
if (strlen(zLineBuf) > strlen(zRemainderBuf)) {
/* to minimize the chance of doing another (expensive) malloc, we double the length of zRemainderBuf */
free(zRemainderBuf);
zRemainderBuf = malloc(strlen(zLineBuf) * 2);
}
strncpy(zRemainderBuf, zLineBuf, zBufIdx);
zRemainderBuf[zBufIdx] = '\0';
}
} while (zStream.avail_out == 0);
} while (zError != Z_STREAM_END);
/* close gzip stream */
zError = inflateEnd(&zStream);
if (zError != Z_OK) {
fprintf(stderr, "could not close z-stream!\n");
return EXIT_FAILURE;
}
if (zRemainderBuf)
free(zRemainderBuf);
fclose(inFp);
return EXIT_SUCCESS;
}
相關問題
- 1. 如何提取讀取壓縮文件?
- 2. Node.js在不解壓的情況下讀取zip文件
- 3. 可以讀取壓縮文件比未壓縮的文件快嗎?
- 4. 讀取壓縮文件
- 5. 在不使用jar文件的情況下讀取Excel文件
- 6. 如何在不壓縮的情況下估算文件的可壓縮性?
- 7. 可以提升iostreams即時讀取和壓縮gzip文件嗎?
- 8. 提取壓縮文件
- 9. 如何在不用java解壓縮的情況下讀取壓縮文件的內容
- 10. 如何在不提取和重新壓縮的情況下重命名zip歸檔文件中的文件?
- 11. 如何在不鎖定的情況下讀取文本文件?
- 12. 上傳壓縮文件,解壓縮並讀取文件
- 13. 解壓縮文件並讀取解壓縮文件
- 14. Android視圖壓縮文件不提取
- 15. 是否可以在不重新讀取的情況下多次添加從FXML文件加載的組件?
- 16. j2me - 是否可以在不使用FileConnection API的情況下讀取/寫入文本文件?
- 17. 在Apache中讀取壓縮文件(.xz)
- 18. 是否可以讀取鎖定文件?
- 19. 是否可以讀取.exe文件?
- 20. pgbouncer可以在不重啓的情況下重新讀取/ etc/hosts文件
- 21. 在不執行壓縮的情況下計算/估計壓縮文件大小
- 22. 是否可以在不提供依賴性的情況下編譯java文件?
- 23. 自解壓Zip文件是否可以讀取註冊表項?
- 24. Spark 2.1.0:讀取壓縮的csv文件
- 25. 如何讀取壓縮的DICOM文件
- 26. python fastparquet模塊可以讀取壓縮的parquet文件嗎?
- 27. 是否可以通過mixin和/或'XOR'壓縮壓縮文件?
- 28. 是否可以壓縮或壓縮.otf(Open Type Face)文件?
- 29. 是否可以包含壓縮文件中的JavaScript文件?
- 30. 如何在不使用javascript的情況下讀取excel文件
如果你能讀一個壓縮文件,解壓沒有它,就不會有任何點在解壓所有,你不覺得嗎?文件將被永久壓縮。 – EmilioPelaez 2012-02-15 08:12:27
@EmilioPelaez:將一部分壓縮數據提取到內存中可能很有用,這是一個可以隨後處理的未壓縮的流。例如,SAX解析器可以在壓縮的XML文件上運行,其中部分文件被提取,解析並丟棄或進一步處理。 – 2012-02-15 08:19:54
@EmilioPelaez請先詢問爲什麼在你評論之前做這件事。感謝Alex Reynolds澄清它。 – andsien 2012-02-15 08:40:58