Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/05/2007, à 05: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 smile merci d'avance

Hors ligne

#2 Le 12/05/2007, à 12: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 : https://ask.libreoffice.org/fr/

Hors ligne

#3 Le 12/05/2007, à 13: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 wink

Dernière modification par spike_spiegel (Le 12/05/2007, à 13:28)

Hors ligne

#4 Le 12/05/2007, à 14:12

JBF

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


LibreOffice : https://fr.libreoffice.org/ (téléchargement, documentation, FAQ, assistance, contribuer, ...)
Aide pour LibreOffice par la communauté francophone : https://ask.libreoffice.org/fr/

Hors ligne

#5 Le 12/05/2007, à 14: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, à 14:38

spike_spiegel

Re : Aide compilation d'un code source pour reparer des ZIP

JBF a écrit :
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 big_smile ) 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 smile

Dernière modification par spike_spiegel (Le 12/05/2007, à 14:39)

Hors ligne

#7 Le 12/05/2007, à 14:48

spike_spiegel

Re : Aide compilation d'un code source pour reparer des ZIP

toto4455 a écrit :

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, à 14:49)

Hors ligne

#8 Le 12/05/2007, à 14:49

Link31

Re : Aide compilation d'un code source pour reparer des ZIP

spike_spiegel a écrit :
// 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.

spike_spiegel a écrit :
// 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, à 14:51)

Hors ligne

#9 Le 12/05/2007, à 15: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