J'ai écrit un programme C pour extraire des fichiers d'une archive tar en utilisant libarchive.libarchive lit trop de caractères lors de l'extraction d'un fichier
Je voudrais extraire un fichier de cette archive et l'imprimer vers la sortie standard. Mais je reçois des caractères supplémentaires. C'est de la foutaise, mais ça vient d'un autre fichier (peut-être adjacent dans l'archive). Je pense que la sortie se terminera à </html>
.
Voici le code qui lit this tar file:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "archive.h"
#include "archive_entry.h"
int main (int argc, const char * argv[])
{
struct archive *a;
struct archive_entry *entry;
int r;
int64_t entry_size;
a = archive_read_new();
archive_read_support_compression_none(a);
archive_read_support_format_tar(a);
r = archive_read_open_filename(a, "0000.tar", 1024);
if (r != ARCHIVE_OK)
{
printf("archive not found");
}
else
{
while (archive_read_next_header(a, &entry) == ARCHIVE_OK)
{
const char *currentFile = archive_entry_pathname(entry);
char *fileContents;
entry_size = archive_entry_size(entry); //get the size of the file
fileContents = malloc(entry_size); //alloc enough for string - from my testing I see that this is how many bytes tar and ls report from command line
archive_read_data(a, fileContents, entry_size); //read data into fileContents string for the HTML file size
if(strcmp(currentFile, "vendar-definition.html") == 0)
{
printf("file name = %s, size = %lld\n", currentFile, entry_size);
printf("%s\n\n", fileContents); //this output over-reads chars from another file in this tar file
}
free(fileContents); //free the C string because I malloc'd
}
}
printf("exit");
return 0;
}
libarchive 2.8.3 compilé sur mac os X 10.6.3. gcc 4.2 x86_64
ls -l vendar-definition.html
me donne 1921
pour la taille du fichier. Et montre ainsi tar tfv 0000.tar | grep vendar-definition.html
. Donc, signale la sortie C qui indique la taille du fichier. Pour moi, cela semble correct.
Deux possibilités que je peux voir pourquoi ma sortie n'est pas comme prévu:
- J'ai fait l'erreur ou
- caractères multi-octets d'un débutant dans les fichiers d'archives a quelque chose à voir avec elle.
ne serait pas mieux si fileContents et currentFile ont été déclarés en dehors du bloc while? –
En outre, mon gcc se plaint en essayant d'utiliser char * au lieu de void * pour fileContents. Ce faisant, un simple printf ("% s", fileContents) a été résolu. S'il vous plaît, vérifiez si cela fonctionne pour vous. –