comment copier ou supprimer un fichier sur le disque dur en c++ ?

comment copier ou supprimer un fichier sur le disque dur en c++ ? - C++ - Programmation

Marsh Posté le 28-01-2004 à 15:13:21    

sous windows.
merci.


Message édité par terminator_t800 le 28-01-2004 à 15:15:53
Reply

Marsh Posté le 28-01-2004 à 15:13:21   

Reply

Marsh Posté le 28-01-2004 à 15:22:39    

avec les fonction standard std::remove et la copie, ben à la main avec différentes variantes

Reply

Marsh Posté le 28-01-2004 à 15:28:19    

moi j'aime bien
 

Code :
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <fstream>
  4. int main(int argc, char *argv[])
  5. {
  6.   if (argc != 3)
  7.     return 0;
  8.   // en binaire pour certains systèmes  
  9.   std::ifstream in(argv[1], std::ios::binary);
  10.   std::ofstream out(argv[2], std::ios::binary);
  11.   if(!in or !out)
  12.     return 0;
  13.   out << in.rdbuf();
  14.   // être sur que tout est terminé avant la suppression
  15.   out.close();
  16.   std::remove(argv[2]);
  17. }

Reply

Marsh Posté le 28-01-2004 à 15:35:28    

ok merci
mais c quelle librarie précisément qui se charge de copier ou supprimer le fichier, c'est cstdlib ?

Reply

Marsh Posté le 28-01-2004 à 15:41:11    

je sais pas ce que c'est qu'une « librarie »

Reply

Marsh Posté le 28-01-2004 à 15:49:03    

indice : s/librairie/bibliothèque/g

Reply

Marsh Posté le 28-01-2004 à 15:49:54    

taz a écrit :

je sais pas ce que c'est qu'une « librarie »


 
ca t'amuses tant que ca de faire ton enculeur de mouches ?

Reply

Marsh Posté le 28-01-2004 à 15:53:43    

chrisbk a écrit :


 
ca t'amuses tant que ca de faire ton enculeur de mouches ?

bah oui, je sors le code correct, alors je me le permets ... et pi c'était ça ou RTFM :D

Reply

Marsh Posté le 28-01-2004 à 16:55:34    

if(!in or !out)
 
c la surcharge de quel operateur qui permet de faire ca ??
 
edit :
et puis or ?
chez moi ca compile pas ...
 
if(!in.good() || !out.good())
 
p-e ?


Message édité par blackgoddess le 28-01-2004 à 16:58:59

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 28-01-2004 à 16:59:10    

sur c cas présent, c'est operator!

Reply

Marsh Posté le 28-01-2004 à 16:59:10   

Reply

Marsh Posté le 28-01-2004 à 17:00:00    

t'as as besoin de good ou de bad, tu veux utiliser if(in) ou if(!in)
 
operator void * et operator!

Reply

Marsh Posté le 28-01-2004 à 17:00:57    

taz a écrit :

t'as as besoin de good ou de bad, tu veux utiliser if(in) ou if(!in)
 
operator void * et operator!


stun brin porcho, je trouve

Reply

Marsh Posté le 28-01-2004 à 17:01:14    

non pas du tout pourquoi ?

Reply

Marsh Posté le 28-01-2004 à 17:02:08    

personne pour me dire  
« Taz t'es un dieu, tu manipules les streambuf comme personne » ?

Reply

Marsh Posté le 28-01-2004 à 17:02:45    

bah au final tu sais meme plus ce que tu test. Chui pas contre la surcharge d'operateur, mais la ca me parait abusé, une fonction serait plus claire.

Reply

Marsh Posté le 28-01-2004 à 17:03:47    

bah si tu sais ce que tu testes : y a plusieurs façons de le faire, mais la sémantique est là même, c'est ça l'important. je trouve ça super élégant

Reply

Marsh Posté le 28-01-2004 à 17:04:40    

or existe pas chez moi, c'est un standard ?


Message édité par blackgoddess le 28-01-2004 à 17:05:12

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 28-01-2004 à 17:05:47    

si or est même un mot clef.
également standard

Reply

Marsh Posté le 28-01-2004 à 17:06:11    

if (in). ca test quoi ? s'il a pu ouvrir le fichier ou s'il y a encore des octets a lire dans le bouzin ? je trouve ca trop vague. Enfin bon rien me force a utiliser ca non plus, je sais

Reply

Marsh Posté le 28-01-2004 à 17:07:13    

ça teste si le flux est ok. à la moindre erreur, ça échoue

Reply

Marsh Posté le 28-01-2004 à 17:07:44    

sinon apparement pour le !in ca serait la surcharge de l'operateur bool :
 
operator bool() const
{
...
}


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 28-01-2004 à 17:09:30    

ouais ça peut dépendre, les deux existent sans doute (j'ai pas le papier sous la main)
ton implémentation est comme ça ?

Reply

Marsh Posté le 28-01-2004 à 17:13:59    

oui (stl de ms)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 28-01-2004 à 17:14:57    

tu pourrait me montrer un exemple avec la surcharge de ! et void* ? parce que je vois pas trop comment c'est fait :(


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 28-01-2004 à 17:23:36    

non, operator bool n'est pas standard
 
 
un truc bidon
 

Code :
  1. struct Foo
  2. {
  3.   int state;
  4.   const int value;
  5.   Foo(int s, int v)
  6.     : state(s),
  7.       value(v)
  8.   {}
  9.   bool operator!() const
  10.   {
  11.     return state!=value;
  12.   }
  13.   operator void * ()
  14.   {
  15.     return this;
  16.   }
  17. };


 
 
 

Code :
  1. #include <iostream>
  2. #include <iomanip>
  3. int main()
  4. {
  5.   Foo f(25, 42);
  6.   std::cout << std::boolalpha << !f << std::endl;
  7.  
  8.   f.state = f.value;
  9.   std::cout << std::boolalpha << !f << std::endl;
  10.   std::cout << f << std::endl;
  11. }


Message édité par Taz le 28-01-2004 à 17:36:24
Reply

Marsh Posté le 28-01-2004 à 17:31:28    

bien, ok merci :)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 28-01-2004 à 17:32:48    

après
 
!f ou not f

Reply

Marsh Posté le 28-01-2004 à 17:33:40    

Taz t'es un dieu, tu manipules les streambuf comme personne :o

Reply

Marsh Posté le 28-01-2004 à 17:37:49    

merci :o

Reply

Marsh Posté le 28-01-2004 à 17:44:15    

(not existe pas non plus chez moi)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 28-01-2004 à 17:47:27    

bah t'as qu'à avoir un compilateur C++
 
les versions littérales d'un tas d'opérateurs sont standards depuis quasiment le départ. et C99 enf ait des macros standards

Reply

Marsh Posté le 28-01-2004 à 17:56:32    

taz a écrit :

je sais pas ce que c'est qu'une « librarie »

:sarcastic:

Reply

Marsh Posté le 28-01-2004 à 19:34:24    

finalement on a appris plein de trucs sur ce topic qui me semblait d'abord pourri :sol:

Reply

Marsh Posté le 28-01-2004 à 19:41:28    

uhu :)
 
sinon, pour en revenir au sujet ,si tu veux sous windows de l'api windows sans portabilité possible, la msdn est ton amie :
 
DeleteFile : http://msdn.microsoft.com/library/ [...] tefile.asp
CopyFile : http://msdn.microsoft.com/library/ [...] pyfile.asp

Reply

Marsh Posté le 28-01-2004 à 19:47:00    

et boost cupède t'en fait quoi ?
 
cela dit sur un truc simple comme ça (voir mon code), pas la peine de passer par autre chose

Reply

Marsh Posté le 28-01-2004 à 19:58:25    

tiens voui :)
 
je viens de voir boost.filesystem :)
 
jme demande comment ca marche sous windows qui fonctionne avec des lettres de lecteur et pas des points de montage ...

Reply

Marsh Posté le 28-01-2004 à 20:00:12    

grâve a un superbe surcahrge d'opérateur et d'effet de bords

Reply

Marsh Posté le 04-03-2004 à 11:56:10    

Taz a écrit :

avec les fonction standard std::remove et la copie, ben à la main avec différentes variantes


 
Certainement pas. On utilise l'API win32 :
 
CopyFile et DeleteFile.

Reply

Marsh Posté le 04-03-2004 à 12:03:16    

DocMaboul a écrit :


 
Certainement.

avant de upper des vieux trucs, tu pourrais le lire en entier au moins :o
merci de ton intervention inutile


Message édité par Taz le 04-03-2004 à 12:03:29
Reply

Marsh Posté le 04-03-2004 à 12:05:55    

Taz a écrit :

moi j'aime bien
 

Code :
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <fstream>
  4. int main(int argc, char *argv[])
  5. {
  6.   if (argc != 3)
  7.     return 0;
  8.   // en binaire pour certains systèmes  
  9.   std::ifstream in(argv[1], std::ios::binary);
  10.   std::ofstream out(argv[2], std::ios::binary);
  11.   if(!in or !out)
  12.     return 0;
  13.   out << in.rdbuf();
  14.   // être sur que tout est terminé avant la suppression
  15.   out.close();
  16.   std::remove(argv[2]);
  17. }




 
C'est sûr que c'est joli sauf que c'est nul (t'as appris le C++ sur une calculatrice ou quoi ?)
 
Déjà, les performances de ton machin dépendent de l'implementation de la stl. Avec celle fournie par le VC de krosoft, là, tu fais une copie octet par octet. Over top ridicule.
 
Ensuite, en imaginant que tu prennes une implémentation un peu plus sérieuse, il faut savoir que la plupart utilisent un buffer de 8Ko. En programmant soit-même une boucle avec un buffer de 64 Ko, tu vas réduire le temps d'exécution de ta copie d'un rapport de 1/3 à 1/2 sur un fichier un tant soit peu conséquent.
 
Pour finir, j'ai bien aimé le gros bug dans ton exemple : pas de test d'erreur pour savoir si l'écriture s'est correctement déroulée.
Si pour une raison x ou y, une erreur survient, on tombe tout droit dans le remove sans avoir réalisé de copie correcte du fichier d'origine.
Moralité : on perd ses données.
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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