#1 Le 12/05/2007, à 04:15
- spike_spiegel
Aide compilation d'un code source pour reparer des ZIP
Bonjour ;
Voila j'ai télécharger un gros zip et en le decompressant j'obtient ceci :
End-of-central-directory signature not found. Either this file is not
a zipfile, or it constitutes one disk of a multi-part archive. In the
latter case the central directory and zipfile comment will be found on
the last disk(s) of this archive.
note: tom_38.zip may be a plain executable, not an archive
unzip: cannot find zipfile directory in one of tom_38.zip or
tom_38.zip.zip, and cannot find tom_38.zip.ZIP, period.
En googlant bien j'ai reussi à trouvé un code source qui permet d'y remedier mais je ne m'y connais pas bcp en progarmmation je suis debutant et j'aimerais compiler ce code sous Linux
// Zipofig. A quick-n-dirty tool to rip files from ZIP archives.
// Please note that files are extracted but not uncompressed.
// For more details visit http://www.literatecode.com
//
// Written by Ilya O. Levin, Nov 2003
//
// How to compile:
// cl zipofig.c /RELEASE
//
// Run without parameters to see help on usage.
//
// Compatibility notes:
// Zipofig was written to be compiled with MS Visual C compiler.
// [b]If you want to compile Zipofig with different compiler then
// please address the usage of __int64, _lseeki64, _read, _close
// and _telli64 yourself.[/b] ( j'ai pas compris cette phrase ? )
//
#include <io.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#define ARCH_NAME argv[2]
#define F_BUFFER_SIZE 32768
#pragma pack(1)
typedef struct
{
// unsigned long sig; // signature, must be 0x02014b50
unsigned short versmb; // version made by
unsigned short vers; // version needed
unsigned short flags; // some bit flags
unsigned short method; // compression method, 0=store
unsigned short lmtime; // time of last modification
unsigned short lmdate; // date of last modification
unsigned long crc32;
unsigned long compsize; // compressed size
unsigned long origsize; // original size
unsigned short fnamlen; // length of file name field
unsigned short extrlen; // length of extra field
unsigned short fremlen; // length of file commend field
unsigned short dskns; // disk number start
unsigned short intfa; // internal file attributes
unsigned long extfa; // external file attribute
unsigned long roffs; // relative offset of local header
// file_name char[fnamlen]
// extra_field char[extrlen]
// file_rem char[fremlen]
} TZIPFileHeader;
typedef struct
{
// unsigned long sig; // signature, must be 0x06054b50
unsigned short thisdsk; // number of this disk
unsigned short CDdsk; // number of disk with the start of central dir (CD)
unsigned short CDnThis; // number of entries in the CD on this disk
unsigned short CDn; // total number of entries in the CD
unsigned long CDsize; // size of the central dir
unsigned long CDoffs; // offset of start of CD
unsigned short zipremlen; // length of ZIP file comment
// zip_comment char[zipremlen]
} TZIPEndOfCentralDirRecord;
typedef struct
{
unsigned long sig; // signature, must be 0x04034b50
unsigned short vers; // version needed
unsigned short flags; // some bit flags
unsigned short method; // compression method, 0=store
unsigned short lmtime; // time of last modification
unsigned short lmdate; // date of last modification
unsigned long crc32;
unsigned long compsize; // compressed size
unsigned long origsize; // original size
unsigned short fnamlen; // length of file name field
unsigned short extrlen; // length of extra field
// file_name char[fnamlen]
// extra_field char[extrlen]
} TZIPLocalHeader;
volatile __int64 g_diroff; // offset of central directory in zip file
void find_dir_offs(long); // find offset of central directory in zip file
void enum_archive(long, char); // enum contents of zip archive
int main(int argc, char *argv[])
{
long fhn;
printf("Zipofig. A quick-n-dirty ripper for zip archives\n"
"Written by Ilya O. Levin, http://www.literatecode.com\n"
"NO WARRANTIES OF ANY KIND, USE AT YOUR OWN RISK\n\n");
if (argc<3)
{
printf("Usage: zipofig <command> archive\n"
"Examples: zipofig l yale.zip, zipofig e pkscrewed.zip\n"
"Commands:\n"
" l: list contents of archive\t\te: rip files from archive\n"
);
return 1;
}
printf("Archive: %s\n\n", ARCH_NAME);
fhn=_open(ARCH_NAME, O_RDONLY|O_BINARY,0);
if (fhn!=-1)
{
g_diroff=0;
switch(tolower(argv[1][0]))
{
case 'l': // list contents of archive
find_dir_offs(fhn);
enum_archive(fhn, 0);
break;
case 'e': // rip files from archive
find_dir_offs(fhn);
enum_archive(fhn, 1);
break;
default:
printf("Unknown command specified - %c\n", argv[1][0]);
break;
}
_close(fhn);
} else printf("Archive does not exist or unaccessible\n");
return 0;
} // main
void find_dir_offs(long fhn)
{
TZIPEndOfCentralDirRecord e;
long rc;
unsigned long sig;
// scan for signature of 'EndOfCentralDir' record
printf("* looking for zip struct... ");
_lseek(fhn, -18, SEEK_END);
_read(fhn, &sig, sizeof(sig));
while(_telli64(fhn)>32) if(sig==0x06054b50)
{
rc=_read(fhn, &e, sizeof(e));
if (rc==sizeof(e)) g_diroff=e.CDoffs;
break;
} else {_lseek(fhn, -5, SEEK_CUR); _read(fhn, &sig, sizeof(sig));}
printf("%s\n", (g_diroff)?"ok":"failed");
} // find_dir_offs
void enum_archive (long fhn, char ripemall)
{
TZIPFileHeader h;
TZIPLocalHeader o;
long rc, outfhn;
__int64 boo,ofpos;
unsigned long sig, lbuf, numripped=0, numtotal=0;
char *fn, *buf;
if (!g_diroff) return; // do nothing if cd offset is not initialized
if (ripemall)
{
buf=(char *)malloc(F_BUFFER_SIZE);
if (buf==NULL)
{
printf("* Insufficient memory for I/O operations\n");
return;
}
else printf("* Ripping:\n");
}
else printf("\nCompressed Original CRC32 Name\n"
"------------ ------------ -------- -------------\n");
_lseeki64(fhn, g_diroff, SEEK_SET);
rc=_read(fhn, &sig, sizeof(sig));
while (rc>3)
{
if (sig==0x02014b50)
{
boo=_telli64(fhn)-4;
rc=_read(fhn, &h, sizeof(h));
if (rc<sizeof(h)) break;
fn=(char *) malloc(h.fnamlen+1);
if (fn==NULL) break;
fn[h.fnamlen]=0;
rc=_read(fhn, fn, h.fnamlen);
if (ripemall)
{
if (h.compsize&&h.origsize&&h.crc32) // file to rip
{
printf("- %s...", fn);
numtotal++;
ofpos=_telli64(fhn);
_lseeki64(fhn, h.roffs, SEEK_SET);
outfhn=_open(fn, O_WRONLY|O_BINARY|O_CREAT, S_IREAD|S_IWRITE);
if (outfhn!=-1)
{
// skip local file header
_read(fhn, &o, sizeof(o));
if (o.sig==0x04034b50) // local file header valid
{
_lseeki64(fhn, o.extrlen+o.fnamlen, SEEK_CUR);
while(h.compsize)
{
if (h.compsize<F_BUFFER_SIZE) lbuf=h.compsize;
else lbuf=F_BUFFER_SIZE;
_read(fhn, buf, lbuf);
_write(outfhn, buf, lbuf);
h.compsize-=lbuf;
}
numripped++;
printf("ok\n");
} else printf("bad hdr\n");
_close(outfhn);
} else printf("failed\n");
_lseeki64(fhn, ofpos, SEEK_SET);
} else // directory to create
{
printf("- creating %s... ", fn);
printf("%s\n", (_mkdir(fn))?"failed":"ok");
}
}
else // list content of archive mode
{
printf("%12d %12d %08x %s\n", h.compsize, h.origsize, h.crc32, fn);
numtotal++;
}
free(fn);
if (h.compsize) _lseeki64(fhn, h.extrlen+h.fremlen, SEEK_CUR); else _lseeki64(fhn, boo+1, SEEK_SET);
}
else _lseeki64(fhn, -3, SEEK_CUR);
rc=_read(fhn, &sig, sizeof(sig));
}
if (ripemall) free(buf);
printf("\nTotal in archive %d file(s)\n"
"Ripped %d file(s)\n",
numtotal, numripped);
} // enum_archive
Voila ce que me donne la compilation directement :
spike@spike-desktop:~/telechargement$ gcc -o zipofig zipofig.c
zipofig.c:19:16: erreur: io.h : Aucun fichier ou répertoire de ce type
zipofig.c:84: erreur: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘g_diroff’
zipofig.c: In function ‘main’:
zipofig.c:109: erreur: ‘O_BINARY’ undeclared (first use in this function)
zipofig.c:109: erreur: (Each undeclared identifier is reported only once
zipofig.c:109: erreur: for each function it appears in.)
zipofig.c:112: erreur: ‘g_diroff’ undeclared (first use in this function)
zipofig.c: In function ‘find_dir_offs’:
zipofig.c:146: erreur: ‘g_diroff’ undeclared (first use in this function)
zipofig.c: In function ‘enum_archive’:
zipofig.c:160: erreur: ‘__int64’ undeclared (first use in this function)
zipofig.c:160: erreur: expected ‘;’ before ‘boo’
zipofig.c:164: erreur: ‘g_diroff’ undeclared (first use in this function)
zipofig.c:186: erreur: ‘boo’ undeclared (first use in this function)
zipofig.c:199: erreur: ‘ofpos’ undeclared (first use in this function)
zipofig.c:201: erreur: ‘O_BINARY’ undeclared (first use in this function)
voila merci d'avance
Hors ligne
#2 Le 12/05/2007, à 11:28
- JBF
Re : Aide compilation d'un code source pour reparer des ZIP
Bonjour,
si déjà tu essayais de télécharger ton fichier zip à nouveau pour vérifier qu'il n'est pas tout simplement corrompu ?
JBF
LibreOffice : https://fr.libreoffice.org/ (téléchargement, documentation, FAQ, assistance, contribuer, ...)
Aide pour LibreOffice par la communauté francophone : Ask LibreOffice
Hors ligne
#3 Le 12/05/2007, à 12:26
- spike_spiegel
Re : Aide compilation d'un code source pour reparer des ZIP
Euuh en faite cette erreur arrive souvent aux gens , telecharger un fichier zip complet et au moment de le decopresser on obtient une structure invalide , d'apres ce que j'ai lu la plupart du temps les programmes ZIP ne savent pas s'y prendre pour detourner ce probleme et en general meme en essayant different logiciels de reparation ça ne marche pas .
J'ai obtenu ce code source ici , l'auteur explique etape par etape ce qui se passe lors de la decompression d'un fichier qui genere l'erruer suivante : "fin du repertoire central non trouvée" , or ce qui ce passe en réalité c'est que le decompresseur ne trouve pas la taille des fichiers dans leurs headers ainsi il les prend pour des fichiers vides .
Ce programme permet de parcourir toute l'archive de header en header en recalculant manellement la taille de chaque fichier à l'interieur de cette archive , on peut alors tout recuperer , ce qui est infaisable d'apres ce que j'ai lu en fouinant partout sur le net , et donc j'aimerais compiler ce code sous linux et le partager , ça pourait etre trés utile à certains
Dernière modification par spike_spiegel (Le 12/05/2007, à 12:28)
Hors ligne
#4 Le 12/05/2007, à 13:12
- JBF
Re : Aide compilation d'un code source pour reparer des ZIP
Euuh en faite cette erreur arrive souvent aux gens , telecharger un fichier zip complet et au moment de le decopresser on obtient une structure invalide , d'apres ce que j'ai lu la plupart du temps les programmes ZIP ne savent pas s'y prendre pour detourner ce probleme et en general meme en essayant different logiciels de reparation ça ne marche pas .
Souvent je ne sais pas, en tous les cas cela m'est arrivé extrêmement rarement de ne pas arriver à décompresser un fichier zip.
Si le fichier que tu télécharge est corrompu c'est à ton fournisseur à le réparer. Ou alors c'est pendant le téléchargement qu'il y a un problème.
JBF
LibreOffice : https://fr.libreoffice.org/ (téléchargement, documentation, FAQ, assistance, contribuer, ...)
Aide pour LibreOffice par la communauté francophone : Ask LibreOffice
Hors ligne
#5 Le 12/05/2007, à 13:38
- toto4455
Re : Aide compilation d'un code source pour reparer des ZIP
je dirais qu'il faut definir les equivalants des fct _func
sans rien garantir en gros ca donnerais un truc du style
#define __int64 long long
#define _open open
#define _close close
#define _lseek lseek
#define _read read
#define _write write
#define _lseeki64 lseek64
#define _mkdir(fn) mkdir(fn,S_IRWXU)
#define _telli64(fhn) lseek64(fhn, (__off64_t)0, SEEK_CUR)
#6 Le 12/05/2007, à 13:38
- spike_spiegel
Re : Aide compilation d'un code source pour reparer des ZIP
spike_spiegel a écrit :Euuh en faite cette erreur arrive souvent aux gens , telecharger un fichier zip complet et au moment de le decopresser on obtient une structure invalide , d'apres ce que j'ai lu la plupart du temps les programmes ZIP ne savent pas s'y prendre pour detourner ce probleme et en general meme en essayant different logiciels de reparation ça ne marche pas .
Souvent je ne sais pas, en tous les cas cela m'est arrivé extrêmement rarement de ne pas arriver à décompresser un fichier zip.
Si le fichier que tu télécharge est corrompu c'est à ton fournisseur à le réparer. Ou alors c'est pendant le téléchargement qu'il y a un problème.JBF
ah oui j'ai oublié une precision , j'ai la facheuse mani d'arreter et de reprendre les téléchargements ( wget -c ) car je télécharge de grosses archives avec pleins de fichiers à l'interieur mais je suis obligé de le faire à cause de mes deconnexion intempestives . Enfin bref le dit fichier corrumpu je l'ai retélécharger avant meme de poster ici mais je me suis dis que ça serait utile un programme pareil ,
merci quand meme JBF
Dernière modification par spike_spiegel (Le 12/05/2007, à 13:39)
Hors ligne
#7 Le 12/05/2007, à 13:48
- spike_spiegel
Re : Aide compilation d'un code source pour reparer des ZIP
je dirais qu'il faut definir les equivalants des fct _func
sans rien garantir en gros ca donnerais un truc du style
#define __int64 long long
#define _open open
#define _close close
#define _lseek lseek
#define _read read
#define _write write
#define _lseeki64 lseek64
#define _mkdir(fn) mkdir(fn,S_IRWXU)
#define _telli64(fhn) lseek64(fhn, (__off64_t)0, SEEK_CUR)
Je viens d'essayer et ça a l'air un peu plus propore
spike@spike-desktop:~/telechargement$ gcc -o zipofig zipofig.c
zipofig.c:19:16: erreur: io.h : Aucun fichier ou répertoire de ce type
zipofig.c: In function ‘main’:
zipofig.c:119: erreur: ‘O_BINARY’ undeclared (first use in this function)
zipofig.c:119: erreur: (Each undeclared identifier is reported only once
zipofig.c:119: erreur: for each function it appears in.)
zipofig.c: In function ‘enum_archive’:
zipofig.c:211: erreur: ‘O_BINARY’ undeclared (first use in this function)
voila ce que contiennent les lignes suscitées
19: #include <io.h> // je suppose qu'il ya surement un equivalent à cette bibliotheque //
....
119: fhn=_open(ARCH_NAME, O_RDONLY|O_BINARY,0);
....
211: outfhn=_open(fn, O_WRONLY|O_BINARY|O_CREAT, S_IREAD|S_IWRITE);
Dernière modification par spike_spiegel (Le 12/05/2007, à 13:49)
Hors ligne
#8 Le 12/05/2007, à 13:49
- Link31
Re : Aide compilation d'un code source pour reparer des ZIP
// Zipofig was written to be compiled with MS Visual C compiler. // If you want to compile Zipofig with different compiler then // please address the usage of __int64, _lseeki64, _read, _close // and _telli64 yourself.
C'est rempli de fonctions non-standard et d'appels bas-niveau spécifiques à windows... J'ai bien essayé de corriger le code, mais pas moyen de trouver l'équivalent de certaines fonctions avec les même arguments sous Linux (_telli64 par exemple).
Tu devrais contacter l'auteur et lui expliquer que si une norme existe pour le C, c'est pour qu'on s'en serve.
Pour ceux qui veulent se lancer, commencez par remplacer #include <io.h> par #include <sys/io.h>, et le paramètre O_BINARY est inutile sous Linux.
// Zipofig. A quick-n-dirty tool to rip files from ZIP archives.
quick-n-dirty... En effet.
Dernière modification par Link31 (Le 12/05/2007, à 13:51)
Hors ligne
#9 Le 12/05/2007, à 14:00
- spike_spiegel
Re : Aide compilation d'un code source pour reparer des ZIP
Merci pour ton aide Link31 je vais essayer de contacter l'auteur
Hors ligne