Programmé sous Linux. Compatible windows.
Liste les fichiers d'un répertoire come indiqué dans le titre grâce à la bibliothèque dirent.h
Modes :
-Récursif (sous répertoires)
-Affichage des fichiers cachés (qui commencent par un point)
-Filtre d'extensions (n'affiche que les fichiers à l'extension spécifiée)
-Tri dichotomique desactivé croissant ou décroissant
-Affichage des fichiers/ répertoires, fichiers seulement, répertoires seulement.
Utilisation : voir main()
Ouvert à toutes critiques constructives. Ceci est ma première source en C++ je viens de VB.NET xD.
Ptite question : Pour créer une classe est t'on obligé d'avoir un fichier d'entete .h et un fichier source ou peut on tout regroupé dans le fichier d'entete afin que le fichier soit plus exportable?
Source / Exemple :
/*
Name : DEMIRDJIAN Yves
Date : 15/11/2008
Version : 1.0
Type : C++
#include <iostream>
#include <vector>
#include <string>
#include <dirent.h>
using namespace std;
namespace ListAllFiles
{
struct ListFiles_Opts
{
ListFiles_Opts() //Valeurs par défaut
{
Recurs = false;
Sort = 0;
Type = 2;
FiltrExt = "*";
WithHiddenFiles = false;
}
bool Recurs; //Analyser les sous répertoires?
short int Sort; // Pas de tri : Sort=0, Tri croissant : Sort = 1, Tri decroissant : Sort = 2 !!!Attention : tri ASCII
short int Type; //Tout : Type=2, Fichier : Type=1, Répertoire : Type=0
string FiltrExt; //Fichiers a extensions. Une seule extension "*" Pour tout afficher ou laisser la chaine vide. Exemple FiltrExt="mp3".
bool WithHiddenFiles; //La recherche inclus les fichiers cachés
}; //ListFiles_Opts
bool FiltreFile(string &Name, ListFiles_Opts Opts)
{
//le nom est suposé être non nul étant donné qu'un fichier de nom de fichier vide ne peut exister
if (Opts.WithHiddenFiles == false && Name[0] == '.') return false;
if (Opts.FiltrExt.empty() || Opts.FiltrExt == "" ||Opts.FiltrExt == "*") return true;
//trouver le point, le point ne peut être en position 0 ou en dernier position
int Pos = Name.length() - 2;
while (Pos > 0)
{
if (Name[Pos] == '.') break;
--Pos;
}
if (Pos <= 0) return false;
//trouver l'extension. Les '/' du filtre permette une recherche directe avec mot entier sans mélanger 2 extensions
string Ext = Name.substr(Pos + 1, Name.length() - Pos - 1);
if (Opts.FiltrExt == Ext) return true;
return false;
}
void InsertElemSorted(vector<string> &Vec, string &Elem, short int SortType)
{
//*********************
//Dochotomie insertion
//*********************
if (SortType == 0 || Vec.empty())
{
Vec.push_back(Elem);
}
else //if(!Vec.empty())
{
int Deb = 0;
int Fin = Vec.size() - 1;
int Pos;
if (SortType == 1) //Tri croissant
{
while (Deb <= Fin)
{
Pos = Deb + (Fin - Deb) / 2;
if (Elem > Vec[Pos])
{
Deb = Pos + 1;
}
else
{
Fin = Pos - 1;
}
}
}
else //SortType == 2, tri décroissant
{
while (Deb <= Fin)
{
Pos = Deb + (Fin - Deb) / 2;
if (Elem < Vec[Pos])
{
Deb = Pos + 1;
}
else
{
Fin = Pos - 1;
}
}
}
vector<string>::iterator it = Vec.begin();
it += Deb;
Vec.insert(it, Elem);
}
} //InsertElemSorted
void ListFilesRec(string Path, vector<string> &Out, ListFiles_Opts Opts)
{
//vérification du formattage du chemion d'accès pour une bonne cohérence
if (Path[Path.length() - 1] != '/') Path += "/";
//Parcours du répertoire
DIR *InitialRep = opendir(Path.c_str());
if (InitialRep != NULL)
{
struct dirent *SRep;
while ((SRep = readdir(InitialRep)) != NULL) //tant que le répertoire contient des fichiers
{
//definir le chemin d'acces complet
string FileFound = SRep->d_name;
string PathFound = Path + FileFound;
//ajouter au vecteur mais selon le filtre et les options choisies
if (FiltreFile(FileFound, Opts))
{
if (Opts.Type == 2)
{
InsertElemSorted(Out, PathFound, Opts.Sort);
}
else
{
if (!((bool (Opts.Type)) ^ (opendir(PathFound.c_str()) == NULL))) InsertElemSorted(Out, PathFound, Opts.Sort); //On vérifie le type (fichier/repertoire) et selon les option on insere l'élément
}
}
//si recursivité dans les sous répertoires, analyser le repertoire
if (Opts.Recurs && FileFound != "." && FileFound != "..") ListFilesRec(PathFound + "/", Out, Opts);
}
//fermer le repertoire courant
closedir(InitialRep);
}
} //ListFilesRec
} //Namespace ListAllFiles
int main()
{
vector<string> MaListFics; //Ma liste de fichiers de sortie
ListAllFiles::ListFiles_Opts MesOpts; //Ma structure option
//Paramètres que je veux
MesOpts.WithHiddenFiles = false;
MesOpts.Recurs = false;
MesOpts.Sort = 1;
MesOpts.Type=0;
MesOpts.FiltrExt ="*";
//On lance tout ca
ListAllFiles::ListFilesRec("/home", MaListFics, MesOpts); //Changer le chemin du répertoire ici.
//On affiche (cela peut prendre un petit temps supplémentaire)
cout << "Terminé." << endl << "Pressez une touche..." << endl;
getchar();
for (unsigned u = 0; u < MaListFics.size(); ++u)
{
cout << MaListFics[u] << endl;
}
return 0;
} //main
27 avril 2009 à 14:47
26 avril 2009 à 15:55
23 nov. 2008 à 21:13
23 nov. 2008 à 11:17
pour la remarque des class, pas forcément dans le fonctionnement actuel aucun intérêt de faire des class.
Il faut absolument que les pro C++ arrête de voir des class partout!!!
Dans le contexte actuel ce code devrait être adapté en C (car mis à part l'utilisation de librairies, et de codage...) ce code ne gagne rien à être fait en C++ surtout si ce code s'oriente performance et linux.
bon codage.
23 nov. 2008 à 11:01
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.