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

Boost C++ Discussion :

[Boost::Filesystem] copie recursive d'un repertoire


Sujet :

Boost C++

  1. #1
    Membre averti
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Points : 392
    Points
    392
    Par défaut [Boost::Filesystem] copie recursive d'un repertoire
    Bonjour, j'essaie d'implementer une copie recursive d'un repoertoire qui copie tout sauf les sous-repertoires CVS.

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    #include <boost/filesystem.hpp>
    #include <string>
    #include <iostream>
     
    template<class stringT>
    struct	CvsDir;
     
    template<> struct CvsDir<std::string> 
    {
    	static const	char*		name = "CVS";
    };
     
    template<> struct CvsDir<std::wstring> 
    {
    	static const	wchar_t*	name = L"CVS";
    };
     
    template<class pathT>
    bool	CopyWithoutCVS(pathT src, pathT dst)
    {
    	namespace fs = boost::filesystem;
     
    	try
    	{
    		if(!fs::exists(src))
    			return false;
     
    		if(fs::is_directory(src))
    		{
    			//directory mode
    //			std::cout << src.leaf() << "is a directory" << std::endl;
    			if(equivalent(src.leaf(), CvsDir<pathT::string_type>::name))
    				return false;
     
    			fs::directory_iterator	dirEnd;
    			for(fs::directory_iterator srcIter(src); srcIter != dirEnd; srcIter++)
    			{
    				bool bRet = CopyWithoutCVS<pathT>(*srcIter, dst);
    			}
    		}
    		else if(fs::is_regular(src))
    		{
    			//file mode
    //			std::cout << src.leaf() << "is a file" << std::endl;
    		}
    		return true;
    	}
    	catch(fs::basic_filesystem_error<pathT>& e)
    	{
    //		std::cerr << "Cannot read path." << e.what() << std::endl;
    		return false;
    	}
    }
    Ce template me semble correct, mais ca me donne pleins d'erreurs en compilant son instanciation (avec path et wpath).
    Même si j'enlève la "politique" de nom de repertoire (qui ne fonctionne pas non plus), j'obtiens tout sauf une compialtion correcte.

    À quoi mes erreurs sont-elles dues?

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Comme le dit le compilateur:
    only static const integral data members can be initialized within a class
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    template<class stringT>
    struct	CvsDir;
     
    template<> struct CvsDir<std::string> 
    {
    	static const	char*		name;
    };
    const	char*CvsDir<std::string> ::name = "CVS";
     
    template<> struct CvsDir<std::wstring> 
    {
    	static const	wchar_t*	name;
    };
    const	wchar_t*CvsDir<std::wstring> ::name= L"CVS";

  3. #3
    Membre averti
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Points : 392
    Points
    392
    Par défaut
    merci déjà pour celle-là, mais j'ai une autre erreur en utilisant le template avec path et wpath qui me dit qu'il ne peut pas définier le type.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CopyWithoutCVS<fs::wpath>(srcDir, tgtDir);
    (avec wpath)

    et avec path:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	const char*	szDvdRoot	= argv[1];
    	const char*	szSongRoot	= argv[2];
     
    	printf("DvdRoot given as '%s'\n", szDvdRoot);
    	printf("SongRoot given as '%s'\n", szSongRoot);
     
    	boost::filesystem::path	songPath(szSongRoot);
    	boost::filesystem::path	dvdPath(szDvdRoot);
     
    	CopyWithoutCVS<boost::filesystem::path>(songPath, dvdPath);
    	CopyWithoutCVS<boost::filesystem::path>(dvdPath, songPath);
    des idées?

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Quelles erreurs as-tu à la compilation?

  5. #5
    Membre averti
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Points : 392
    Points
    392
    Par défaut
    essentiellement l'erreur C2664, comme quoi, il ne trouve pas de paramètre de conversion adéquat.
    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
     
    FileCopyAction.cpp
    d:\wiip\prg_common\tools\musiicstage\include\boost\test\impl\execution_monitor.ipp(792) : warning C4535: calling _set_se_translator() exige /EHa
    d:\wiip\prg_common\tools\musiicstage\include\copywithoutcvs.h(46) : error C2664: 'boost::filesystem::basic_directory_iterator<Path>::basic_directory_iterator(const Path &)': Conversion du parametre 1 de 'boost::filesystem::wpath' en 'const boost::filesystem::path &' impossible
            with
            [
                Path=boost::filesystem::path
            ]
            Raison: Conversion de 'boost::filesystem::wpath' en 'const boost::filesystem::path' impossible
            Aucun operateur de conversion disponible qui puisse executer cette conversion ou l'operateur ne peux pas être invoqué.
            d:\wiip\prg_common\tools\musiicstage\src\filecopyaction.cpp(48): Regardez le lien vers l'instanciation du template de fonction compilé "bool CopyWithoutCVS<boost::filesystem::wpath>(pathT,pathT)".
            with
            [
                pathT=boost::filesystem::wpath
            ]
    d:\wiip\prg_common\tools\musiicstage\include\copywithoutcvs.h(48) : error C2664: 'CopyWithoutCVS': Conversion du parametre 1 de 'boost::filesystem::basic_directory_entry<Path>' vers 'boost::filesystem::wpath' impossible
            with
            [
                Path=boost::filesystem::path
            ]
                    Aucun operateur de conversion disponible qui puisse executer cette conversion ou l'operateur ne peux pas être invoqué.

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Désolé, je ne parle pas l'allemand (ou le neerlandais) dans le texte. A titre de rappel, le site étant francophone, merci de convertir ces messages d'erreur dans leur équivalent français.

  7. #7
    Membre averti
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Points : 392
    Points
    392
    Par défaut
    oki, désolé d'avoir un système allemand. J'ai édité la partie du code en question et traduit les messages. En principe, l'ID de l'erreur devrait suffire pour avoir sa description.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Merci pour la traduction.
    Je pense que ton problème vient que tu utiliser fs::directory_iterator pour path et pour wpath. Normalement, dans ce dernier cas, tu devrais utiliser wdirectory_iterator. Ta classe est générique sur pathT, donc tu devrais utiliser un générique pour l'itérateur: basic_directory_iterator< pathT >. Je ne connais pas bien boost::fs, mais il me semble que cela doit être la piste.
    Cordialement.

Discussions similaires

  1. copie récursive sous mandriva 2006
    Par achech dans le forum Mandriva / Mageia
    Réponses: 2
    Dernier message: 15/08/2007, 22h04
  2. Réponses: 23
    Dernier message: 03/08/2007, 13h52
  3. Boost FileSystem 1.34
    Par epsilon68 dans le forum Boost
    Réponses: 4
    Dernier message: 28/05/2007, 13h09
  4. Réponses: 18
    Dernier message: 28/08/2006, 23h07
  5. linux boost filesystem
    Par dj.motte dans le forum Boost
    Réponses: 5
    Dernier message: 23/07/2006, 23h30

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