// repertoire.cpp: Des informations sur fichiers // > informations sur un fichier (cf infoFic() et dans 'main()') // > parcours d'un répertoire (voir dans 'main()') // // auteur: R.Astier // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + #include <iostream> #include <string> #include <dirent.h> // pour parcours d'un répertoire #include <sys/stat.h> // pour type et taille de fichier //include <sys/mode.h> // pour type et taille de fichier using namespace std; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // penser à sys/stat.h void permissions(mode_t mode,char perm[9+1]) { // Permission propriétaire(USR) groupe(GRP) autres(OTH) //? cout<<" permissions:"<<sperm(statInfo.st_mode); perm[0]=(mode & S_IRUSR ? 'r' : '-'); perm[1]=(mode & S_IWUSR ? 'w' : '-'); perm[2]=(mode & S_IXUSR ? 'x' : '-'); perm[3]=(mode & S_IRGRP ? 'r' : '-'); perm[4]=(mode & S_IWGRP ? 'w' : '-'); perm[5]=(mode & S_IXGRP ? 'x' : '-'); perm[6]=(mode & S_IROTH ? 'r' : '-'); perm[7]=(mode & S_IWOTH ? 'w' : '-'); perm[8]=(mode & S_IXOTH ? 'x' : '-'); } // Revoie -1 si le fichier nomF n'existe pas, 0 sinon // http://www.opengroup.org/onlinepubs/009695399/functions/stat.html // penser à include <sys/stat.h> int infoFic(char nomF[],int & taille,int & ficS,int & rep,char perm[]) { struct stat statInfo; if (stat(nomF, &statInfo) == -1) return -1; else { taille=statInfo.st_size; rep=S_ISDIR(statInfo.st_mode); ficS=S_ISREG(statInfo.st_mode); permissions(statInfo.st_mode,perm); } return 0; } // Quelques fonctions utilisant des champs de 'struc stat'; int estRepertoire(mode_t mode) { return(S_ISDIR(mode)); } int estFicSimple(mode_t mode) { return(S_ISREG(mode)); } int tailleFic(struct stat statInfo) { return statInfo.st_size; } time_t tempsModif(struct stat statInfo) { return statInfo.st_mtime; } // repA: nom absolu d'un répertoire // Renvoie un chemin absolu ou // '' si repA n'est pas un chemin absolu // '' si chemin a trop de remontée (..) string fusionChemin(string repA, string chemin) { string fus=repA; unsigned int ins,ind = chemin.find_first_not_of(" \t\n\r\b"); // Cas chemin: vide ou chemin absolu; cas repA n'est pas absolu if(ind == string::npos) return fus; else if(chemin[ind] == '/') return chemin; else if(repA[0] != '/') return ""; else { chemin.erase(0,ind); ind=0; } string compo; do { ins = chemin.find_first_of('/',ind); if(ins == string::npos) ins=chemin.length(); // cout<<chemin<<": "<<chemin.length()<<" ind:"<<ind<<" ins:"<<ins<<endl; compo=chemin.substr(ind,ins-ind); if(compo == ".") ; else if(compo != "..") { fus += "/"; fus +=compo; } else { // Remonter d'un niveau unsigned int ii=fus.find_last_of('/'); if(ii==0 && fus.length()==1) return ""; if(ii == 0) ii=1; fus=fus.substr(0,ii); } // cout<<"compo: "<<chemin.substr(ind,ins)<<" fusion: "<<fus<<endl; ind=ins+1; } while(ind<chemin.length()); return fus; } // - - - - - - Q u e l q u e s u t i l i s a t i o n s - - - - - + int main( int nm, char *mots[]) { string abs=getenv("PWD"); // répertoire absolu string chem; string fus= fusionChemin("/abs"," xyz"); cout<<" fusionChemin('/abs','xyz') '"<<fus<<"'"<<endl; fus= fusionChemin(abs,"xyz"); cout<<" fusionChemin '"<<fus<<"'"<<endl; fus= fusionChemin(abs,"../xyz"); cout<<" fusionChemin '"<<fus<<"'"<<endl; fus= fusionChemin(abs,"../.././xyz"); cout<<" fusionChemin '"<<fus<<"'"<<endl; fus= fusionChemin(abs,"../../././xyz"); cout<<" fusionChemin '"<<fus<<"'"<<endl; fus= fusionChemin(abs,"../../abc/xyz"); cout<<" fusionChemin '"<<fus<<"'"<<endl; fus= fusionChemin(abs,"abc/."); cout<<" fusionChemin '"<<fus<<"'"<<endl; fus= fusionChemin(abs,""); cout<<" fusionChemin '"<<fus<<"'"<<endl; cout<<" fusionChemin '"<<fusionChemin(abs,"").c_str()<<endl; // Parcours de répertoire cout<<"\nRépertoire courant: "<<getenv("PWD")<<endl; char nomRep[256]; cout<<"Nom du répertoire: "; cin >> nomRep; DIR * pRep = opendir(nomRep); if(pRep==NULL) { cout<<"Impossible d'ouvrir "<<nomRep<<endl; cout<<"\n exit > > > "; cin.getline( new char[80],80); exit(1); } cout<<"Parcours du répertoire "<<nomRep<<endl; int lg,nLR=0; // longueur d'un nom, nb.lignes du réperetoire struct dirent * pLigneRep=readdir(pRep); char * nomDR; // nom dans le répertoire char nomFic[1024]; char perm[9+1]="rwxrwxrwx"; int taille, estRep, estFS; while(pLigneRep!=NULL) { cout<<endl; // Regrouper répertoire et nom du fichier nomDR=pLigneRep->d_name; strcpy(nomFic,nomRep); strcat(nomFic,"/");strcat(nomFic,nomDR); nLR++; cout.width(3); cout<<nLR<<" "; // pour cadrer à droite sur 18 colonnes lg=18-pLigneRep->d_namlen; if(lg<1) lg=1; cout<<pLigneRep->d_name<<string(lg,' ')<<' '; // information sur ce "fichier" // sys/mode.h S_ISDIR(statInfo.st_mode) S_ISREG(statInfo.st_mode) if(infoFic(nomFic,taille,estFS, estRep,perm) != -1) { // if (stat(nomFic, &statInfo) != -1) { // permissions(statInfo.st_mode,perm); cout<<perm; // if(S_ISDIR(statInfo.st_mode)) cout<<" répertoire"; // else if(S_ISREG(statInfo.st_mode)) cout<<" fic.simple"; // else cout<<" autre cas!"; if(estFS) cout<<" fic.simple"; else if(estRep) cout<<" répertoire"; else cout<<" autre cas!"; cout.width(8); cout<<taille<<" octets"; } // ligne suivante pLigneRep=readdir(pRep); } cout<<endl; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + cout<<"\n> > > "; cin.getline( new char[80],80); return 0; } /* #include <sys/types.h> #include <sys/dir.h> DIR *opendir(char *filename); struct dirent *readdir(DIR *dirp); long telldir(DIR *dirp); void seekdir(DIR *dirp, long loc); void rewinddir(DIR *dirp); void closedir(DIR *dirp); int dirfd(DIR *dirp) */ //fin repertoire.cpp