我正在构建一个应用程序,它需要在不提取文件的情况下读取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. 可以提升iostreams即时读取和压缩gzip文件吗?
- 4. 提取压缩文件
- 5. 如何在不用java解压缩的情况下读取压缩文件的内容
- 6. 如何在不锁定的情况下读取文本文件?
- 7. 上传压缩文件,解压缩并读取文件
- 8. 是否可以在不重新读取的情况下多次添加从FXML文件加载的组件?
- 9. pgbouncer可以在不重启的情况下重新读取/ etc/hosts文件
- 10. 是否可以读取.exe文件?
- 11. 是否可以读取锁定文件?
- 12. 自解压Zip文件是否可以读取注册表项?
- 13. Spark 2.1.0:读取压缩的csv文件
- 14. python fastparquet模块可以读取压缩的parquet文件吗?
- 15. 如何在不使用javascript的情况下读取excel文件
- 16. 是否可以压缩或压缩.otf(Open Type Face)文件?
- 17. 是否可以包含压缩文件中的JavaScript文件?
- 18. 提取100%压缩率的Zip文件
- 19. 在ObjectiveC中读取.doc(MSWord)文件?
- 20. 我可以做multipe写入和multipe读取到一个压缩/压缩文件
- 21. ENOENT ENOENT尝试读取压缩文件
- 22. 无法读取解压缩classes.dex文件?
- 23. DTF:在不提取文件的情况下更新档案内的文件
- 24. 如何在不解压缩的情况下列出zip压缩文件中的文件?
- 25. 从android中提取压缩文件夹
- 26. 使用boost :: iostreams提取压缩文件
- 27. 如何在不导致磁盘读取的情况下提供静态文件?
- 28. 在不改变缩进的情况下压缩文本
- 29. 是否可以将PDF文件作为txt文件读取?
- 30. 如何在不提取到新位置的情况下解压c#文件中的.zip文件
如果你能读一个压缩文件,解压没有它,就不会有任何点在解压所有,你不觉得吗?文件将被永久压缩。 – 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