www.pudn.com > LECTEUR-MP3.zip > RepExplorer.h
// RepExplorer.h: interface for the CRepExplorer class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_REPEXPLORER_H__79E21A78_CC37_4D5E_8FD4_D7B3575970D5__INCLUDED_)
#define AFX_REPEXPLORER_H__79E21A78_CC37_4D5E_8FD4_D7B3575970D5__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/***********************************************
CRepExplorer -> CRep---> CRep
|
|----> CRepFile
^
|
CAudioFile
^
|
CMp3File
***********************************************/
#include "afxtempl.h"
//-----------------------------------------------
//Il est possible de gerer tout type de fichier
//en créent des classes qui herite de CRepFile
//Ensuite celon l'extension du nouveau type
//de fichier il faut modifier la fct
//CRep::CreateFilebyType pour créé un object de
//votre nouveau type celon l'extension du fichier
//-----------------------------------------------
class CRep;
class CRepFile
{
public:
CRepFile(WIN32_FIND_DATA * pFindFileData, CRep * pFileRep);
virtual ~CRepFile();
//Retourne les attributs du fichier
CString GetFileName() { return m_strFileName;}
int GetFileSize() { return m_iFileSize;}
CString GetFileExt() { return m_strFileExt;}
//Retourne la date de création, du dernier acces et de la dernière modif
void GetTimeAttribute(FILETIME * pftCreationTime, FILETIME * pftLastAccessTime, FILETIME * pftLastWriteTime);
//Retourne un ptr sur le dossier qui contient ce fichier
CRep * GetFileRep() { return m_pFileRep; }
//Retourne l'extension d'un fichier (.txt par exemple)
static CString ExtractExt(CString strFileName);
protected :
CString m_strFileName;
CString m_strFileExt;
int m_iFileSize;
FILETIME m_ftCreationTime;
FILETIME m_ftLastAccessTime;
FILETIME m_ftLastWriteTime;
CRep * m_pFileRep;
};
//-----------------------------------------------
//Par exemple cette classe derive de CRepFile et
//et destinné a gerer des fichier de type audio
//Mais chaque fichier audio (wma, mp3 ...) a
//des carracteristiques differentes, donc cette
//classe abstraite doit etre redefinit pour
//chaque type de fichier audio
//-----------------------------------------------
class CAudioFile : public CRepFile
{
public :
CAudioFile(WIN32_FIND_DATA * pFindFileData, CRep * pFileRep);
virtual CString GetTitle() = 0;
virtual CString GetArtist() = 0;
virtual CString GetAlbum() = 0;
virtual CString GetYear() = 0;
virtual CString GetComment() = 0;
virtual CTimeSpan GetFileLenght();
void SetFileLenght(CTimeSpan Lenght) {m_FileLenght = Lenght;}
CString GetStringLenght();
protected :
CTimeSpan m_FileLenght;
};
//-----------------------------------------------
//Voila c'est la classe la plus bas niveau, elle
//herite de CAudioFile et ne gere que les fichier
//de type mp3.
//Mais on peut recuperer les infos de cette
//classe a traver les fct virtuelle de CAudioFile
//-----------------------------------------------
class CMp3File : public CAudioFile
{
public:
CMp3File(WIN32_FIND_DATA * pFindFileData, CRep * pFileRep);
virtual ~CMp3File();
//Recuperer les info du tag
CString GetTitle() {return m_strTitle;}
CString GetArtist(){return m_strArtist;}
CString GetAlbum(){return m_strAlbum;}
CString GetYear(){return m_strYear;}
CString GetComment(){return m_strComment;}
private :
//Permet de trier les infos du tag
void Copy(DWORD nBegin, DWORD nLength, LPSTR lpSrc, char szDest[]);
//Retourne la duréé du mp3
CTimeSpan ReadLenght(CString strFilePath);
private :
CString m_strTitle;
CString m_strArtist;
CString m_strAlbum;
CString m_strYear;
CString m_strComment;
int m_nGenre;
};
//-----------------------------------------------
//Classe qui s'occupe de gerer les dossiers
//Chaque CRep contient la liste de ces fichiers
//(CRepFile) et la liste de ces sous dossiers
//(CRep).Permet toutes les operation sur
//les dossiers.
//-----------------------------------------------
class CRepExplorer;
class CRep
{
public:
CRep(CString strPath, CRepExplorer * pRepExplorer, CRep * pParent);
virtual ~CRep();
/****************** NAVIGATION *******************/
//Retourne un ptr sur le sous rep du rep courant si il existe NULL sinon
CRep * GetRepByName(CString strRepName) const;
//Permettent de lister tous les sous rep d'un rep
POSITION GetFirstRepPos() const;
CRep * GetNextRep(POSITION &pos) const;
//Permettent de lister tous les fichiers d'un rep
POSITION GetFirstFilePos();
CRepFile * GetNextFile(POSITION &pos) const;
/*************************************************/
/************ AJOUT / MODIF / SUPPRESION *********/
//Ajoute un sous repertoire au repertoire courant
CRep * AddSubRep(CString strRepName);
//Modifie le nom du repertoire
bool ModifRepName(CString strRepNewName);
//Fonction de suppresion RECURSIVE
//Un dossier est supprimer avec tous ces sous dossier et fichiers
bool DeleteSubRep(CString strRepName);
bool DeleteThisRep();
/*************************************************/
//Retourne le Nom du repertoire
CString GetRepName() {return m_strRepName; }
//Retourne le chemin complet du dossier
CString GetRepPath() {return m_strRepPath;}
//Retourne vrai si le dossier contient des sous dossier
bool bIsExistSubRep() {return !m_ListChildRep.IsEmpty(); }
//Retourne vrai si le dossier contien des fichiers
bool bIsExistFile();
//retourne vrai si le dossier ou un de ces sous dossier contien un fichier
bool bIsExistSubFile();
//Retourne vrai si l'extension du fichier existe dans la liste
//Retourne toujours vrai si on utilise pas les filtre (CRepExplorer::m_bUseFilter)
bool VerifFileInFilterList(CRepFile * pRepFile);
//Retourne un ptr sur le père
CRep * GetParentRep() { return m_pParentRep;}
private:
//Recupère les fichier du dossier
//fct utiliser uniquement si l'arbre a été construit
//avec bOnlyFolderDetect = true
void GetFolderFile();
//Supprime recursivement tous les dossier et fichier d'un dossier
bool DeleteRoutine(CString strRepPath);
//lorsqu'un dossier est supprimer pour supprimer de la liste du père
bool DeleteInChildList(CRep * pRep);
//Crée les fichier en fonction du type
CRepFile * CreateFilebyType(WIN32_FIND_DATA * pFindFileData);
//Retourne vrai si l'extension en param et ds la liste
//Retourne toujours vrai si on utilise pas les filtre (CRepExplorer::m_bUseFilter)
bool VerifExtInFilterList(CString strExt);
private :
bool m_bFileDetected;
bool m_bExistFile;
CString m_strRepName;
CString m_strRepPath;
CList m_ListRepFile;
CList m_ListChildRep;
CRep * m_pParentRep;
CRepExplorer * m_pRepExplorer;
};
//-----------------------------------------------
//Classe la plus haute, c'est elle qui lance
//la construction de l'arbre (ConstructTree)
//Elle permet d'ajouter des filtres (pour ne
//detecter que certain type de fichier)
//Elle contient aussi quelque fct de recherche
//-----------------------------------------------
class CRepExplorer
{
public:
CRepExplorer();
CRepExplorer(CString strRootPath);
virtual ~CRepExplorer();
//Construit l'arbre a partir du rep strRootPath
//Si bOnlyFolderDetect les fichier ne seront pas analyser
//pendant la cration de l'arbre (plus rapide)
//mais a chaque apel de GetFirstFilePos
bool ConstructTree(CString strRootPath, bool bOnlyFolderDetect = false);
//Retourne un pointeur sur le rep de plus haut niveau
CRep * GetRootRep() const {return m_pRootRep;}
//Ajoute ou supprime un extension de fichier a la liste
//si bUseFilter = true, seul les fichiers portant une extension
//ds la liste seront traiter
void AddFileExtInFilter(CString strFileExt);
//Retourne faux si l'extension n'existe pas ds la liste
bool DelFileExtInFilter(CString strFileExt);
//Vide la liste d'extension de fichier
void RazFilterList() {m_FileExtFilterList.RemoveAll();}
void SetUseFilter(bool bUse = false) {m_bUseFilter = bUse;}
bool bUseFilter() {return m_bUseFilter;}
//Retourne vrai si seulement les dossier sont detecter
bool IsOnlyFolderDectect() {return m_bOnlyFolderDetect;}
//Retourne un ptr sur la liste des filtres
CList * GetFileExtFilterList() { return &m_FileExtFilterList;}
/******* Fonction de Recherche **************/
//Cherche dans tout l'arbre le dossier en param
//Retourne NULL si il n'existe pas
CList * FindRepByName(CString strRepName);
//Cherche dans tout l'arbre le fichier en param
//Retourne NULL si il n'existe pas
CList * FindFileByName(CString strFileName);
/**********************************************/
private:
//Recherche recursive ds l'arbre
CRep * RecurRepFind(CRep * pRep, CString strRepName);
void RecurRepFileFind(CRep * pRep, CString strFileName);
private :
CRep * m_pRootRep;
CString m_strRootPath;
bool m_bUseFilter;
bool m_bOnlyFolderDetect;
CList m_RepFindList;
CList m_RepFileFindList;
CList m_FileExtFilterList;
};
#endif // !defined(AFX_REPEXPLORER_H__79E21A78_CC37_4D5E_8FD4_D7B3575970D5__INCLUDED_)