Obtenir la liste des sous répértoires d'un répértoire (Linux gcc-4.0)

almousafer Messages postés 7 Date d'inscription mercredi 9 février 2005 Statut Membre Dernière intervention 25 janvier 2006 - 23 janv. 2006 à 08:37
almousafer Messages postés 7 Date d'inscription mercredi 9 février 2005 Statut Membre Dernière intervention 25 janvier 2006 - 25 janv. 2006 à 12:28
Salut

je programme une application et j'ai besoin de savoir comment obtenir la liste des sous répértoires d'un répértoire : en effet ce répertoire contient des sous répértoires, et chaque sous répértoire contient une image Medicale.

Donc Je spécifie le nom du répértoire, et la fonction va parcourir successivement tous les sous répértoires et elle lira l'image trouvée dans chacun(....)

J'utilise le Linux Mandriva 2006 (gcc-4-..)
Merci.

6 réponses

fredcl Messages postés 547 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 7 octobre 2007 1
23 janv. 2006 à 15:28
Bonjour,



regarde les structures : DIR, dirent et stat.

puis les fonctions et macro : opendir, readdir, stat, S_ISDIR et closedir.



Voici un exemple d'utilisation, mais attention c'est codé avec wxWidgets,

c'est donc juste un exemple du principe d'utilisation des structures, macro et fonctions citées ci-dessus.



/*---------------------------------------------------------------------------*/

void wxMyFTPFrame::UpdateDisplay()

{

int image_id;

long lCount;

size_t count;

wxArrayString files;

wxString current, tmp;

DIR *dp;

dirent *ep;

struct stat buf;



current = wxGetCwd();

m_LocalFiles->DeleteAllItems();



dp = opendir(current.c_str());

if (dp != NULL)

{

count = 0;

while ((ep = readdir(dp)) != NULL)

{

tmp = ep->d_name;

files.Add(tmp);

count++; // le Data ne seras pas égal à zéro

if (tmp != _T("."))

{

if (stat(tmp.c_str(), &buf))

{

buf.st_mode = 0;

buf.st_size = 0;

buf.st_atime = 0;

buf.st_mtime = 0;

buf.st_ctime = 0;

}

lCount = m_LocalFiles->GetItemCount();

lCount = m_LocalFiles->InsertItem(lCount, tmp);



if (S_ISDIR(buf.st_mode))

{


m_LocalFiles->SetItem(lCount, 1, _T("<DIR>"));


m_LocalFiles->SetItemImage(lCount, wxFileIconsTable::folder);


m_LocalFiles->SetItemData(lCount, -count);

}

else

{

#ifdef __WXMSW__


m_LocalFiles->SetItem(lCount, 1, wxString::Format(_T("%lu"),
buf.st_size));

#else


m_LocalFiles->SetItem(lCount, 1, wxString::Format(_T("%llu"),
buf.st_size));

#endif

image_id = wxFileIconsTable::file;

if (tmp.Find(_T('.')) != wxNOT_FOUND)


image_id = wxTheFileIconsTable->GetIconID(tmp.AfterLast(_T('.')));


m_LocalFiles->SetItemImage(lCount, image_id);


m_LocalFiles->SetItemData(lCount, count);

}

wxDateTime dateTime(buf.st_mtime);

//
The ISO 8601 format is HH:MM:SS. I don't want the second


m_LocalFiles->SetItem(lCount, 2, dateTime.FormatISODate() + _T(" ")
+ dateTime.FormatISOTime().Left(5));

}

}

closedir (dp);

m_LocalFiles->SortItems(CompareList, (long)&files);

}

}

/*---------------------------------------------------------------------------*/


Cordialement

Fred Cailleau-Lepetit (http://cfred.free.fr)
0
almousafer Messages postés 7 Date d'inscription mercredi 9 février 2005 Statut Membre Dernière intervention 25 janvier 2006
25 janv. 2006 à 08:09
salut Fred et merci pour ta réponse, ça m'a aidé vraiment beaucoup, mais il reste encore un pb.
en effet voila le code que j'ai ecris à partir de ce que tu m'as ecris :

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>

#include

int main( int argc, char* argv[] )
{

if( argc < 2 )
{
std::cerr << "Usage: " << std::endl;
std::cerr << argv[0] << " DicomDirectory"
<< std::endl;
return EXIT_FAILURE;
}

std::string tmp;
DIR *dp;
dirent *ep;
struct stat buf;

dp = opendir(argv[1]);
if (dp != NULL)
{
while ((ep = readdir(dp)) != NULL)
{
tmp = ep->d_name;
std::cout<<"lecture de :"<<std::endl<<tmp.c_str();
if (tmp != "." && tmp !="..")
{

if (stat(tmp.c_str(), &buf))
{
buf.st_mode = 0;
buf.st_size = 0;
buf.st_atime = 0;
buf.st_mtime = 0;
buf.st_ctime = 0;
}

if (S_ISDIR(buf.st_mode))
{
std::cout<<" est un répértoire"<<std::endl;

}
else
std::cout<<" est un fichier"<<std::endl;
}
}
closedir (dp);

}

return EXIT_SUCCESS;
}

alors cette fonction marche bien( elle lit le répertoire passé en argument et le parcourt en enumerant son contenu), mais ne différe pas entre fichier et repértoire (méme les repértoires sont considerées comme des fichiers, mais ce qui m'etonne c'est que quand j'execute cette fonction dans le repértoire où elle est ([root@timhpux directorylister]# ./directorylister .), ou dans l'un de ses sous répertoires, j'ai bien des bons résultats! (les fichiers sont des fichiers, et les répertoires sont des repertoires!), mais si je l'execute ailleurs, il considére tous des fichiers.

merci d'avance
TimCha
0
almousafer Messages postés 7 Date d'inscription mercredi 9 février 2005 Statut Membre Dernière intervention 25 janvier 2006
25 janv. 2006 à 10:27
salut Fred
j'ai copié l'executable sous un autre répertoire et je l'ai executé là et sa marche bien.
Donc il ne marche bien que dans le répertoire courant ( où il se trouve) et ses sous répertoires.
est ce que t'as une idée sur ce qui se passe?
0
fredcl Messages postés 547 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 7 octobre 2007 1
25 janv. 2006 à 10:51
Bonjour,



Malheureusement je ne peux pas tester ton code sous une machine unix pour l'instant (déplacement).

Mais il me semble que le problème se situe là :
if (stat(tmp.c_str(),
&buf))

car tmp.s_tr() est égal au nom de ton répertoire et pas au chemin complet

il faudrait donc un truc du genre : tmp = argv[1] + SEPARATEURDEREPERTOIRE + tmp

puis lancer la fonction stat.

Cordialement

Fred Cailleau-Lepetit (http://cfred.free.fr)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
almousafer Messages postés 7 Date d'inscription mercredi 9 février 2005 Statut Membre Dernière intervention 25 janvier 2006
25 janv. 2006 à 11:31
salut Fred
Ok je vais réessayer
A+
0
almousafer Messages postés 7 Date d'inscription mercredi 9 février 2005 Statut Membre Dernière intervention 25 janvier 2006
25 janv. 2006 à 12:28
Salut Fred
J'ai essayé comme tu as dis et Je pense que c'est bon comme, ça marche bien
merci
TimCha.

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include

void BrowseDir(std::string current)
{
std::string tmp,repc=".",repp="..";
DIR *dp;
dirent *ep;
struct stat buf;
dp = opendir(current.c_str());
if (dp != NULL)
{
while ((ep = readdir(dp)) != NULL)
{ if (ep->d_name != repc & ep->d_name !=repp)
{
tmp = current+"/"+ep->d_name;
if (stat(tmp.c_str(), &buf))
{
buf.st_mode = 0;
buf.st_size = 0;
buf.st_atime = 0;
buf.st_mtime = 0;
buf.st_ctime = 0;
}
if (S_ISDIR(buf.st_mode))
{
std::cout<<"répértoire "<<tmp.c_str()<<std::endl;
BrowseDir(tmp.c_str());
}
else
std::cout<<"fichier "<<tmp.c_str()<<std::endl;

}
}


//}
closedir (dp);
}
else
}


int main( int argc, char* argv[] )
{

if( argc < 2 )
{
std::cerr << "Usage: " << std::endl;
std::cerr << argv[0] << " DicomDirectory"
<< std::endl;
return EXIT_FAILURE;
}

BrowseDir(argv[1]);
return EXIT_SUCCESS;
}
0
Rejoignez-nous