В настоящее время я пытаюсь передать файл .tar.gz с сервера на клиент через сокеты в C, но я сталкиваюсь с ошибкой при чтении из tar.gz с помощью gzopen + gzread и записи его в новом файле tar.gz с gzwrite происходит сбой, в результате получается файл tar.gz, который поврежден и даже не совпадает с размером оригинала.
Сначала я подумал, что это как-то связано с моим сокетом logi c, но я проверил его в меньшем масштабе и просто прочитал и сразу же записал его в тот же каталог, и даже после этого ошибка сохраняется. Ниже приведен пример кода, демонстрирующего эту проблему:
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);
После выполнения вышеизложенного программа выводит на стандартный вывод, что размер моего .gz составляет 169 байт, и даже печатает gzwrite, который записал в 169 байт новый файл .gz. Так почему же тогда, когда я запускаю stat -c %s test.tar.gz
, я получаю, что размер test.tar.gz равен 24?