Classe de gestion de fichier pak

Description

Cette classe permet de gérer les fichiers de type PAK. Comme ceux utilsés pour le jeu quake.
La structure est basé sur celle de ZORQUE qui a posté sa source il y a
un certain temps. L'idée était de permettre d'extraire les fichiers contenus dans ce type d'archive.
C'est très pratique si vous souhaiter livrer une application avec le moins de fichier possible.
Ma classe ne compresse pas les fichiers mais il n'est pas défendu d'inclure
des fichiers compressés dans l'archive PAK. ;)

N.B
La classe est concu à partir de Borland C++ Builder 6.

Source / Exemple :


const int MAX_CARACTERES_ENTREE = 256;//SELON LE FORMAT PAK(56)
const int MAX_CARACTERES_IDENTITE = 4;

enum TStatutPak{PAK_CHARGE,NOUVEAU_PAK};

struct TStructEntetePak
{
  char MIdentite[MAX_CARACTERES_IDENTITE];
  unsigned int MOffsetEntree1;
  unsigned int MTailleEntrees;
};

struct TStructEntreePak
{
  char MNomFichier[MAX_CARACTERES_ENTREE];
  unsigned int MOffsetOctet1;
  unsigned int MTailleFichier;
};

typedef struct TStructPileRecherche
{
  TSearchRec                    MEntree;
  AnsiString                    MChemin;
  struct TStructPileRecherche*  MSuivant;
}EntSt;

class TFichierPak
{
  protected:
    AnsiString        MChemin;
    AnsiString        MNom;
    unsigned int      MNBEntrees;
    TStatutPak        MStatut;
    TStructEntreePak* MTableauEntrees;

  public:
    TFichierPak();
    TFichierPak(TFichierPak& InFichierPak);
    ~TFichierPak();

    void NouveauPAK();
    bool Charger(AnsiString InChemin, AnsiString InNom);

    //Les fichiers doivent être dans le même répertoire que le chemin.
    //Une fois créé le statut deviens PAK_CHARGE.
    bool Creer(AnsiString InChemin, AnsiString InNom);
    bool CreerAPartirRepertoire(AnsiString InChemin, AnsiString InNom);

    unsigned int ObtenirNBFichiers();
    TStatutPak ObtenirStatut();

    //Doit avoir le statut NOUVEAU_PAK.
    bool AjouterFichier(AnsiString InNom);
    bool EnleverFichier(unsigned int InNoFichier);
    bool EnleverFichier(AnsiString InNom);

    AnsiString ObtenirNomFichier(unsigned int InNoFichier);

    //Doit avoir le statut PAK_CHARGE.
    bool ExtraireFichierSurDisque(unsigned int InNoFichier, AnsiString InDestination);
    bool ExtraireFichierSurDisque(AnsiString InNom, AnsiString InDestination);
    bool ExtraireToutSurDisque(AnsiString InDestination);
    bool ExtraireFichierEnMemoire(unsigned int InNoFichier,TMemoryStream& InMemStream);
    bool ExtraireFichierEnMemoire(AnsiString InNom,TMemoryStream& InMemStream);

  private:
    void InitialiserChaine(char InChaine[]);
    void InitialiserEntrees(AnsiString InChemin);
    long RechercherEntreeDuNom(AnsiString InNom);
    void CopieEntrees(TStructEntreePak* InSource,
      TStructEntreePak* InDestination, unsigned int InNBEntrees);
};

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.