sa combinaison des deux réponses par fainéant et Gilles. utilisez lstat mais ne l'utilisez pas comme slacker dit. Vous devez envoyer à lstat le chemin complet, pas seulement dent-> d_name. Et si vous le savez lstat vous devez inclure sys/stat.h>
si vous regardez la page de manuel pour lstat il existe un programme de test en bas ou tout simplement regarder le mien.
Voici mon programme qui tente de mimer « ls » sur linux.Remarque: les couleurs des séquences d'échappement ne fonctionnent pas dans les fenêtres au cas où vous vous inquiéteriez de la portabilité.
#include <iostream>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int main(int argc,char* argv[]){
char blue[] = { 0x1b, '[', '1', ';', '3', '4', 'm', 0 };
char normal[]={ 0x1b, '[', '0', ';', '3', '9', 'm', 0 };
char green[]= { 0x1b, '[', '0', ';', '3', '2', 'm', 0 };
char red[]= { 0x1b, '[', '0', ';', '3', '1', 'm', 0 };
char cyan[]= { 0x1b, '[', '0', ';', '3', '6', 'm', 0 };
DIR* myDirectory;
char *path=NULL;
size_t size=100;
int result;
char* fullpath;
if (argc >=3){
std::cout<<"Usage: myls <path>"<<std::endl;
return -1;
}
if (argc >= 2){
myDirectory=opendir(argv[1]);
if (errno==ENOENT){
std::cout<<"error: file does not exist"<<std::endl;
return -1;
}
path=argv[1];
if (path[strlen(path)-1]!='/')
strcat(path,"/");
}
else if(argc==1){
path=getcwd(path,size);
strcat(path,"/");
myDirectory=opendir(path);
}
struct stat fileProperties;
struct dirent* directory;
do{
directory=readdir(myDirectory);
if (directory!=NULL){
fullpath=new char[strlen(path)+strlen(directory->d_name)+2];
strcat(fullpath,path);
strcat(fullpath,directory->d_name);
result=lstat(fullpath,&fileProperties);
//std::cout<<result<<fullpath;
switch (fileProperties.st_mode & S_IFMT){
case S_IFDIR: std::cout<<blue;
break;
case S_IFLNK: std::cout<<cyan; break;
case S_IFREG: std::cout<<normal;
default: std::cout<<normal;
if (fileProperties.st_mode & S_IXUSR)
std::cout<<green;
break;
}
std::cout<<directory->d_name<<"\n";
std::cout<<normal;
}
}while(directory!=NULL);
std::cout<<normal<<'\n';
closedir(myDirectory);
delete[] fullpath;
return 0;
}
possible de duper http://stackoverflow.com/questions/1542763/what-is-the-correct-way-to-use-the-stat-function-to-test-if-a-dirent -is-a-direc, http://stackoverflow.com/questions/3029633/how-to-use-dirent-h-correctly, et/ou http://stackoverflow.com/questions/1271064/how-do- i-loop-through-tous-fichiers-dans-un-dossier-using-c. En passant, c'est l'utilisation la plus laide que j'ai jamais vue. Voir les liens pour la raison pourquoi. – rubenvb