boost::filesystem utilisation de copy_file

boost::filesystem utilisation de copy_file - C++ - Programmation

Marsh Posté le 27-07-2007 à 20:01:52    

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
Reply

Marsh Posté le 27-07-2007 à 20:01:52   

Reply

Marsh Posté le 27-07-2007 à 20:05:52    

tu divises des chemins ? [:petrus75]

Reply

Marsh Posté le 27-07-2007 à 20:08:52    

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


Message édité par Amonchakai le 27-07-2007 à 20:09:22
Reply

Marsh Posté le 27-07-2007 à 20:09:33    

pas con ...

Reply

Marsh Posté le 27-07-2007 à 20:10:58    

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


pas sur que ce soit juste ...

Reply

Marsh Posté le 27-07-2007 à 20:16:17    

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
Reply

Marsh Posté le 27-07-2007 à 20:37:38    

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 :)

Reply

Marsh Posté le 27-07-2007 à 21:38:05    

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...)

Reply

Marsh Posté le 27-07-2007 à 23:34:14    

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

Reply

Marsh Posté le 22-08-2008 à 17:23:47    

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...

Reply

Marsh Posté le 22-08-2008 à 17:23:47   

Reply

Marsh Posté le 22-08-2008 à 19:11:46    

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


Message édité par Amonchakai le 22-08-2008 à 19:17:14
Reply

Marsh Posté le 22-08-2008 à 19:15:52    

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 :)

Reply

Marsh Posté le 23-08-2008 à 11:35:14    

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...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed