【发布时间】:2020-05-02 00:52:36
【问题描述】:
我目前正在尝试通过 C 中的套接字将 .tar.gz 文件从服务器传输到客户端,但我遇到了一个错误,即使用 gzopen + gzread 从 tar.gz 读取并将其写入使用 gzwrite 的新 tar.gz 文件失败会导致 tar.gz 文件损坏,甚至与原始文件大小不同。
起初我认为这与我的套接字逻辑有关,但我在较小的范围内对其进行了测试,只是读取并立即将其写入同一目录,即使这样错误仍然存在。以下是一些演示该问题的示例代码:
gzFile gz = gzopen("tar.tar.gz", "r");
// tar.tar contains one text file, tarred with "tar -cvf tar.tar text.txt"
// tar.tar.gz created with "gzip tar.tar"
struct stat st;
stat("tar.tar.gz", &st); // get size
unsigned int gz_buffer_size = st.st_size;
printf(".gz size: %d\n", gz_buffer_size);
unsigned char *gz_buffer = malloc(gz_buffer_size);
gzread(gz, buffer, buffer_size);
gzclose(gz);
gzFile test = gzopen("test.tar.gz", "w");
printf("wrote to test: %d\n", gzwrite(test, gz_buffer, gz_buffer_size));
gzclose(test);
运行上述程序后,程序会向 stdout 打印我的 .gz 的大小为 169 字节,甚至 gzwrite 也会打印出它向新的 .gz 文件写入了 169 字节。那么为什么当我跑的时候
stat -c %s test.tar.gz我知道test.tar.gz的大小是24?
【问题讨论】:
-
看来您正在使用
buffer_size读取buffer,然后使用gz_buffer_size写入gz_buffer。 -
你为什么要解压缩然后重新压缩文件而不是按原样发送??
-
只是为了演示 gzwrite 错误;令人尴尬的是,我没有发现我使用缓冲区和缓冲区大小而不是 gz_buffer 和 gz_buffer_size 的情况。谢谢。