Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1816 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  boost::filesystem utilisation de copy_file

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

boost::filesystem utilisation de copy_file

n°1592598
Amonchakai
Posté le 27-07-2007 à 20:01:52  profilanswer
 

Bonjour à tous,
 
Je suis en train de travailler sur un petit installateur. Et donc pour cela, je veux utiliser une solution portable pour la gestion des fichiers. C'est pourquoi j'ai choisit Boost. Mais j'ai un problème au moment de l'utilisation de copy_file() : il me balance toujours son exception boost::filesystem::basic_filesystem_error.  
Voila ce que j'ai écrit :

Code :
  1. void Installer::copyAllFileThere(const boost::filesystem::path &sourcePath, const boost::filesystem::path &destPath) const {
  2. using namespace boost::filesystem;
  3. // vérifie que le chemin spécifié existe
  4. if(!exists(sourcePath))
  5.  return ;
  6. // crée éventuellement le répertoire de destination
  7. if(!exists(destPath))
  8.  create_directory(destPath);
  9. // itérateur qui désigne la fin des elements du répertoire courant
  10. directory_iterator end_itr;
  11. // pour tous les éléments du répertoire courant
  12. for (directory_iterator itr(sourcePath) ; itr != end_itr; ++itr ) {
  13.  // on regarde si l'élément observé est un répertoire
  14.  if ( is_directory(itr->status()) ) {
  15.   // si c'est le cas on copie récursivement dans ce répertoire
  16.   copyAllFileThere(itr->path(), destPath / itr->path().leaf());
  17.  } else {
  18.   // sinon, il sagit d'un fichier. On copie alors le fichier
  19.   copy_file(itr->path(), destPath/itr->path().leaf());
  20.  }
  21. }
  22. }


Et donc tout se passe bien, jusqu'au moment où il doit copier un fichier... J'imagine que je dois l'utiliser comme un pied... et dans la doc c'est plutôt sommaire comme explication quant à l'utilisation de cette méthode. :/

Citation :


template <class Path1, class Path2> void copy_file(const Path1& from_fp, const Path2& to_fp);
 
    Requires: Path1::external_string_type and Path2::external_string_type are the same type.
 
    Effects: The contents and attributes of the file from_fp resolves to are copied to the file to_fp resolves to.
 
    Throws: basic_filesystem_error<Path> if from_fp.empty() || to_fp.empty() ||!exists(from_fp) || !is_regular(from_fp) || exists(to_fp)
 


Donc si quelqu'un aurai une idée ça ne serai pas de refus :)
 
Merci


Message édité par Amonchakai le 27-07-2007 à 20:21:29
mood
Publicité
Posté le 27-07-2007 à 20:01:52  profilanswer
 

n°1592599
KangOl
Profil : pointeur
Posté le 27-07-2007 à 20:05:52  profilanswer
 

tu divises des chemins ? [:petrus75]

n°1592600
Amonchakai
Posté le 27-07-2007 à 20:08:52  profilanswer
 

oui et non, c'est l'opérateur de concaténation de path ;)


Message édité par Amonchakai le 27-07-2007 à 20:09:22
n°1592601
KangOl
Profil : pointeur
Posté le 27-07-2007 à 20:09:33  profilanswer
 

pas con ...

n°1592602
KangOl
Profil : pointeur
Posté le 27-07-2007 à 20:10:58  profilanswer
 

Code :
  1. itr->path()/itr->path()


pas sur que ce soit juste ...

n°1592604
Amonchakai
Posté le 27-07-2007 à 20:16:17  profilanswer
 

oui, effectivement... a force de faire des tests sur les paramètres, j'ai posté une bourde...  
En fait ce que je voulais mettre c'était

Code :
  1. itr->path()


j'ai fait quelques tests avec .leaf() (qui permet d'obtenir le nom du fichier et c'est resté...)
(je vais éditer mon premier post pour corriger...)


Message édité par Amonchakai le 27-07-2007 à 20:20:29
n°1592611
Amonchakai
Posté le 27-07-2007 à 20:37:38  profilanswer
 

bon, j'ai finalement trouvé (vive le déboguer de VS)  
Donc au final j'ai rajouté un test exists(itr->path()) avant de faire la copie et ça marche... mais j'avoue ne pas comprendre pourquoi le fait de rajouter cette ligne résout mon problème... (en fait je vois pas ce qu'il essayait de copier... )
Donc si quelqu'un a une explication je suis preneur :D
 
merci à toi KangOl pour ton aide :)

n°1592624
IrmatDen
Posté le 27-07-2007 à 21:38:05  profilanswer
 

A tout hasard, il n'aurait pas essayer de copier "." ou ".."? (c'est ptet une question bête, je n'ai encore jamais eu besoinde filesystem...) Toujours est-il que ça posait problème sur un autre fil (mais sans boost...)

n°1592656
Amonchakai
Posté le 27-07-2007 à 23:34:14  profilanswer
 

oui, c'est peut-être une blague comme ça...

n°1776151
NounouRs
Non parce que c pas mon pied !
Posté le 22-08-2008 à 17:23:47  profilanswer
 

J'ai fait une version de copie de repertoire basée sur la tienne, mais ca plante apres un grand nombre d'operations...
 

Code :
  1. bool Core::copyAllFilesThere(const boost::filesystem::path &sourcePath, const boost::filesystem::path &destPath) const {
  2.  // vérifie que le chemin spécifié existe
  3.  if(!boost::filesystem::exists(sourcePath))
  4.   return false;
  5.  // crée éventuellement le répertoire de destination
  6.  if(!boost::filesystem::exists(destPath))
  7.   boost::filesystem::create_directory(destPath);
  8.  // itérateur qui désigne la fin des elements du répertoire courant
  9.  boost::filesystem::directory_iterator end_itr;
  10.  // pour tous les éléments du répertoire courant
  11.  for (boost::filesystem::directory_iterator itr(sourcePath) ; itr != end_itr; ++itr )
  12.  {
  13.   // on regarde si l'élément observé est un répertoire
  14.   if ( boost::filesystem::is_directory(itr->status()) )
  15.   {
  16.    // si c'est le cas on copie récursivement dans ce répertoire
  17.    if ( ! copyAllFilesThere(itr->path(), destPath / itr->path().leaf()) )
  18.     return false;
  19.   }
  20.   else
  21.   {
  22.    // sinon, il sagit d'un fichier. On copie alors le fichier
  23.    boost::filesystem::copy_file(itr->path(), destPath/itr->path().leaf());
  24.   }
  25.  }
  26.  return true;
  27. }


 
 
une idée ?    Je recois une exception boost lors d'un copy_file tout à fait normal...   la seule chose, c'est que je le fais travailler avec un repertoire relatif...

mood
Publicité
Posté le 22-08-2008 à 17:23:47  profilanswer
 

n°1776218
Amonchakai
Posté le 22-08-2008 à 19:11:46  profilanswer
 

[double post... pb de connexion internet... dsl]


Message édité par Amonchakai le 22-08-2008 à 19:17:14
n°1776221
Amonchakai
Posté le 22-08-2008 à 19:15:52  profilanswer
 

Essaye de voir si ce serai pas un problème à cause de fichier déjà existant.
J'ai ressortit les sources de ce projet et je vois que j'avais fait ça comme ça :

Code :
  1. void copyAllFileThere(const boost::filesystem::path &sourcePath, const boost::filesystem::path &destPath, bool erasePrevious) {
  2. using namespace boost::filesystem;
  3. // vérifie que le chemin spécifié existe
  4. if(!exists(sourcePath))
  5.  return ;
  6. // crée l'éventuel répertoire de destination
  7. if(!exists(destPath))
  8.  create_directory(destPath);
  9. // itérateur qui désigne la fin des elements du répertoire courant
  10. directory_iterator end_itr;
  11. // pour tous les éléments du répertoire courant
  12. for (directory_iterator itr(sourcePath) ; itr != end_itr; ++itr ) {
  13.  // on regarde si l'élément observé est un répertoire
  14.  if ( is_directory(itr->status()) ) {
  15.   // si c'est le cas on copie récursivement dans ce répertoire
  16.   copyAllFileThere(itr->path(), destPath / itr->path().leaf());
  17.  } else {
  18.   // sinon, il sagit d'un fichier. On copie alors le fichier
  19.   if(exists(itr->path())) {
  20.    if(exists(destPath/itr->path().leaf())) {
  21.     if(erasePrevious) {
  22.      remove(destPath/itr->path().leaf());
  23.      copy_file(itr->path(), destPath/itr->path().leaf());
  24.     }
  25.    } else
  26.     copy_file(itr->path(), destPath/itr->path().leaf());
  27.   }
  28.  }
  29. }
  30. }


 
Je vois que j'avais rajouté la gestion du fait que le fichier serai déjà existant. Je pense qu'il devait y avoir une raison :D
 
Bon, par contre mon PC de Dev est en rade :/ (problème d'alim...) donc je peux pas tester tout de suite... je vais installer un g++ et boost sur mon X40 et je te dit :)

n°1776420
Amonchakai
Posté le 23-08-2008 à 11:35:14  profilanswer
 

Bon, en fait en y repensant (et en relisant les posts) je crois me rappeler que le truc c'était justement bien au niveau du test d'existence des fichiers que j'avais eu le problème : il essayait de copier des chemin invalide (surement des "." et ".." comme le soulignait IrmatDen)
Essaye en rajoutant ce check...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  boost::filesystem utilisation de copy_file

 

Sujets relatifs
Utilisation port serie en "direct"[VB 2005] Utilisation de Base de donnée MySQL
Filesystem hiérarchiqueProbleme utilisation pointeur et reference
Utilisation du SelectedNodeUtilisation requete php mysql contenant WHERE et AND
File.ListFiles et caractères accentuésutilisation de diff sous unix
[Javascript] Effectuer une copie profonde (deep copy) d'objets[Résolu] utilisation d'une fonction d'un autre classeur.
Plus de sujets relatifs à : boost::filesystem utilisation de copy_file


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR