Classe de gestion de fichier pak

Soyez le premier à donner votre avis sur cette source.

Vue 5 574 fois - Téléchargée 234 fois

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

Ajouter un commentaire Commentaires
Messages postés
14
Date d'inscription
vendredi 28 juillet 2006
Statut
Membre
Dernière intervention
10 août 2006

Merci du conseil, et en plus ça m'évite le fameux "unsigned". :D
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
faut _pas_ utiliser __int64, c'est _mal_ ! uint64_t, dans stdint.h, est standard et portable, deux caractéristiques que n'a pas __int64...
Sinon théoriquement long long unsigned int ça doit marcher sur les machines 32 bits, et en pratique sur les 64 aussi je pense ( mais ça c'est parce que les compilos ne respectent pas la norme )

^^ c'est un smiley :p il correspond à ça :
Messages postés
14
Date d'inscription
vendredi 28 juillet 2006
Statut
Membre
Dernière intervention
10 août 2006

Finalement, jai trouvé c'était que lorsque j'additionnais la taille des fichiers il fallait que je convertisse en "unsigned long" et j'ai du prendre un unsigned __int64 pour retourner la taille total d'un répertoire le long n'état pas assez grand.

C'est vraiment le temps que je revois mes notes sur les types de données lol. En tout cas la ca marche.

En passant, ca veux dire quoi les ^^?
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
"Le problème c'est que je me heurte à un long que je veux convertir en AnsiString mais je crois qu'il le traite comme un int" lool ben stu le dis ^^
bonne chance ;)
Messages postés
14
Date d'inscription
vendredi 28 juillet 2006
Statut
Membre
Dernière intervention
10 août 2006

Je sais que c'est du polymorphisme mais ca fait tout commme un foncteur. Si tu a une autre idée pour le nom n'hésite pas. Je suis un peu à cours d'idée lol.

J'ai presque terminé ma classe TFileSystem. Il me reste les fonctions DeleteDirectory, CopyDirectory et GetDirectorySize.

Le problème c'est que je me heurte à un long que je veux convertir en AnsiString mais je crois qu'il le traite comme un int. En tout cas, dès que j'ai terminé je modifie ma classe TFichierPak :D
Afficher les 15 commentaires

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.