IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Lister les noms de fichiers d'un répertoire


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 56
    Points : 59
    Points
    59
    Par défaut Lister les noms de fichiers d'un répertoire
    Bonjour,

    ce sujet a du déjà être abordé environ 1 milliard de fois... et pourtant je n'ai pas trouvé de réponses à force de recherches....
    j'ai trouvé l'équivalent en C dans la FAQ, mais pas pour le C++.

    Je tombe sur ça
    http://www.developpez.net/forums/d21...ter-repertoir/
    mais il faut #include "dirent.h" mais cela me met l'erreur "impossible d'ouvrir le fichier source "dirent.h""

    ===========

    j'ai tenté également

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    #include "stdafx.h" 
    #include "windows.h"
    #include "stdafx.h"
    #include "assert.h"
     
    #include "limits"
    #include "sstream"
    #include "iostream"
    #include "fstream"
    #include "string"
    #include "vector"
    #include "list"
    #include "map"
     
     
    #define MAX 8192
     
    using namespace std;
     
    	WIN32_FIND_DATA File; 
    	HANDLE hSearch; 
     
    	hSearch = FindFirstFile((LPCWSTR)"*.*", &File);
     
    	if ( hSearch != INVALID_HANDLE_VALUE )
    	{ 
    		do
    		{
    			cout << "print" << endl;
    			printf("%s\n", File.cFileName); 
    		}
    		while ( FindNextFile(hSearch, &File) ); 
     
    		FindClose(hSearch); 
    	}
    	else
    	{
    		cout << "INVALID_HANDLE_VALUE" << endl;
    	}
    Mais la fonction "FindFirstFile" me renvoi systématiquement un INVALID_HANDLE_VALUE.

    ===================

    j'ai également vu "boost.FileSystem" mais je crois qu'il s'agit d'une librairie que l'on doit installer ou ajouter.... mais je souhaiterais utiliser simplement ce qui est proposé de base avec Visual Studio 2010, si cela a une quelconque importance.

    =====================

    Toute info est bonne à prendre pour n'importe quelle piste.
    Merci infiniment.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Au lieu de caster salement ta chaîne de caractères sans savoir ce que tu fais, passe-lui une chaîne du bon type:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    hSearch = FindFirstFile(TEXT("*.*"), &File);
    Et plus bas:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    _tprintf(TEXT("%s\n"), File.cFileName);
    (pense à inclure <tchar.h>)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 56
    Points : 59
    Points
    59
    Par défaut
    Oui j'avoue je viens du JAVA et pour moi il y a le type String et pis c'est à peu près tout (à quelques exceptions et types à part près), donc tous les types différents de text encodage chaînes de caractères différents en C++ m'échappent totalement.

    Bon maintenant le but c'est de transformer ce qui en sort, apparemment des WCHAR_WIN32_FIND_DATAW du "File.cFileName" en string pour les exploiter dans mes fonctions ^^
    (au pire je ferai du sale cast #ironie #cynisme :p )

    En tout cas chapeau pour la réactivité et l'efficacité et un très très grand merci.

    Edit: je viens de voir ta citation dans la signature, je comprends mieux ton aversion pour les cast et la guerre sainte que tu mènes contre cela ^^

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Citation Envoyé par Ayok13 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    
      
    	hSearch = FindFirstFile((LPCWSTR)"*.*", &File);
    Ça, ça me paraît suspect.

    • le c-style cast n'est pas une bonne chose en C++, ça fait faire des c...es (en gros tu fais prendre des vessies pour des lanternes au compilo...mais au runtime tu es rattrapé par la dure réalité de la vie: une chaîne C-style, c'est une série de byte, et si tu te contente de lui mettre un masque sans vraie conversion, tu obtiendras n'importe quoi à la sortie...)
    • le type référencé sur MSDN c'est LPCTSTR et non LPCWSTR
    • à partir d'un littéral, ils suggèrent TEXT("*.*") et non un cast...


    EDIT: =>ici<= se trouve la raison pour laquelle aucun (LPCWSTR) ne fera naître par miracle une vraie LPCWSTR à partir d'un littéral C-style...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 56
    Points : 59
    Points
    59
    Par défaut
    Oui en effet, ça compile, mais à quel prix....

    je fais du C++ pour le boulot surtout, mais ça ne devrait pas durer, et c'est plus un script qu'un programme ce que j'écris, d'où le laxisme dont je fais preuve pour ce code..... donc je comprends l'esprit (et celui qui fait du cast inutile en JAVA je lui fais également manger son code), mais je suis loin d'en saisir encore tous les tenants et aboutissants, et surtout je ne sais pas comment le contourner, en C++

    Thanx again

    EDIT: merci pour le lien je vais regarder ça pour apprentissage

    EDIT 2 : pour info j'ai mis (LPWCSTR) au départ car c'est le type que m'indique VS quand je tape la parenthèse après la fonction...... je ne justifie rien, j'explique .... ^^

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    À ce sujet, voir la citation de ma signature.

    Pour obtenir une string à partir d'un tableau de TCHAR, le plus simple est d'utiliser des fonctions de conversion comme celles-ci.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 56
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    À ce sujet, voir la citation de ma signature.

    Pour obtenir une string à partir d'un tableau de TCHAR, le plus simple est d'utiliser des fonctions de conversion comme celles-ci.
    Oui j'y ai déjà fait référence en EDIT de ma première réponse
    Je galère toujours pour obtenir mon string, mais ça serait quand même honteux de ne pas arriver à convertir ce qu'il me semble être au final un pauvre tableau char en un pauvre string......
    Je vais regarder le lien thanx ^^


    EDIT: ouep bah c'est bien ça, je n'y serais définitivement pas arrivé lol. Donc merci infiniment du lien, j'ai pu utiliser la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    string  GetAString(string const &src) { return src; }
     
    string  GetAString(wstring const &src)
    {
    	size_t cchBufSize = 0;
    	errno_t err = wcstombs_s(&cchBufSize, NULL, 0, src.c_str(), _TRUNCATE);
    	if(err != 0)
    		throw std::runtime_error("Failed to get size of output when converting to string.");
     
    	vector<char> vec(cchBufSize);
    	err = wcstombs_s(&cchBufSize, &vec.at(0), cchBufSize, src.c_str(), cchBufSize-1);
    	if(err != 0)
    		throw std::runtime_error("Failed to convert to string.");
    	string ret(&vec.at(0));
    	return ret;
    }
    qui remplit parfaitement son office, mais j'avoue que je n'aurais pas pu l'écrire moi même en revanche....

    Sujet bel et bien résolut, merci encore

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Pense à bien mettre les deux versions de GetAString() dans ton code, car il suffit d'un changement dans les options du projet pour que le type des TCHAR change...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 56
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pense à bien mettre les deux versions de GetAString() dans ton code, car il suffit d'un changement dans les options du projet pour que le type des TCHAR change...
    Ok thanx, je le rajoute également dans mon EDIT au dessus comme ça la réponse est complète. Je ne comprenais pas trop l'intérêt de prendre un string pour retourner un string.
    En fait c'est le type retourné à la base qui peut être différent selon les types définis....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Lister les noms des fichiers d'un répertoire
    Par Invité dans le forum VBA Access
    Réponses: 2
    Dernier message: 23/05/2011, 13h51
  2. Récupération des tous les noms de fichiers d'un répertoire
    Par Ocian dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 19/11/2009, 19h26
  3. Lister les noms de fichiers présents dans un dossier FTP
    Par nico1214 dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 27/05/2009, 10h36
  4. Réponses: 2
    Dernier message: 03/09/2008, 17h14
  5. Lister les dossiers et fichiers d'un répertoire
    Par scorpia dans le forum ASP
    Réponses: 2
    Dernier message: 11/04/2006, 18h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo