[C] Probleme de noms de fichier longs....

Probleme de noms de fichier longs.... [C] - C++ - Programmation

Marsh Posté le 23-10-2002 à 17:20:38    

Bonjour a tous...
 
Je rencontre un probleme avec les noms de fichiers longs ....
 
J'ai programmé un petit programme qui fait des modifications dans un fichier texte (remove.exe).
Comme j'ai DOSKEY installé sous XP, je tape :
remove "un nom de fichier long.txt"
et ca marche. le nom du fichier est bien pris en argument argV et le programme marche. Doskey place lui meme les doubles quotes "_____"
Mon user voulais faire un  
remove *.txt ....
Hmmmm
J'ai fait un remove2 ou avec un system(), je fais un DIR /b
pour mettre la liste des fichiers texte dans un fichier liste.txt
 
J'arrive bien a lire ce fichier et a afficher les lignes....
 
Mais contrairement a mon autre programme ou le passage par argument marchait impec, mon nouveau programme ne veux pas ouvrir les fichiers (fichier entrée et un fichier sortie avec ZZ_ rajouté devant. Il s'arete au premier espace du nom de fichier.
ex : Acorn missing.txt
Le programme me sort : imposible d'ouvrir Acorn
 
J'ai donc rajouté "a la main" des quotes devant et derriere le nom du fichier pour avoir a nouveau "Acorn missing.txt" comme dans le passage par argument mais ca ne marche toujours pas...
Imposible d'ouvrir "Acorn missing.txt" ....
 
La je seche ,)
Quelqu'un bosse avec des noms de fichiers longs?
Des que suis chez moi je poste les extraits du code..

Reply

Marsh Posté le 23-10-2002 à 17:20:38   

Reply

Marsh Posté le 23-10-2002 à 20:38:41    

Y aurait pas moyen d'utiliser une commmande "généralisée" genre
 
for %f in (*.txt) do remove %f.  
Dans %f on doit retrouver le nom du fichier comme truc.txt
 
Pour les noms longs, si c'est en DOS 32 bits, ça va peut-être (je suis pas certain du tout :(, j'ai modifié un de mes anciens prog DOS en 32 bits mais sais plus :()..

Reply

Marsh Posté le 24-10-2002 à 09:44:45    

carbon_14 a écrit a écrit :

Y aurait pas moyen d'utiliser une commmande "généralisée" genre
 
for %f in (*.txt) do remove %f.  
Dans %f on doit retrouver le nom du fichier comme truc.txt
 
Pour les noms longs, si c'est en DOS 32 bits, ça va peut-être (je suis pas certain du tout :(, j'ai modifié un de mes anciens prog DOS en 32 bits mais sais plus :()..




 
Faire un .bat tu veux dire? J'ai essayé et le programme s'arrete aux noms avec un espace a l'interieur.... No chance :/
 
Voila le debut du code de ma deuxieme version du programme...
Si quelqu'un a une idée... Je peux lui envoyer les sources et des fichiers exemples ,)
 
Merci de votre temps !
 

Code :
  1. /* Fichier.c Remove [a] Ver 1.2 14/10/2002 */
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. enum {SUCCESS, FAIL, MAX_LEN = 200} ;
  6. int LineReadWrite(FILE *fin, FILE *fout) ;
  7. main ()
  8. {
  9.         FILE * fptr1, *fptr2, *fptr3 ;
  10.         int reval = SUCCESS ;
  11.         char fichiercurrent[MAX_LEN] ;
  12.         int fichierread = 0 ;
  13.         int nblignes ;
  14.         system ("DIR *miss*.txt /b >liste.txt" ) ;
  15.         if ((fptr3 = fopen("liste.txt", "r" )) == NULL)
  16.         {
  17.          printf("Ouverture imposible du fichier liste.txt\n" ) ;
  18.         reval = FAIL ;
  19.         }
  20.         while  (!feof(fptr3))
  21.         {
  22.          char filename1[200] = "\"ZZ_";
  23.         char filename2[200] = "\"" ;
  24.                 char quote = '\"' ;
  25.                 fgets(fichiercurrent, MAX_LEN, fptr3) ;
  26.         fichierread++ ;
  27.         strcpy(filename2, fichiercurrent) ;
  28.                 filename2[(strlen(filename2))-1] = quote ;
  29.            /*     strcat(filename2, quote) ;   */
  30.          strcat(filename1, fichiercurrent) ;
  31.             filename1[(strlen(filename1))-1] = quote ;
  32.            /*     strcat(filename1, quote) ;   */
  33.                 printf("-%s-\n",filename1) ;
  34.         if ((fptr1 = fopen(filename1, "w" )) == NULL)
  35.          {
  36.          printf("Ecriture imposible dans %s\n", filename1) ;
  37.          reval = FAIL ;
  38.          }
  39.         else
  40.          {
  41.          if ((fptr2 = fopen(filename2, "r" )) == NULL)
  42.          {
  43.           printf("Ouverture imposible de %s\n", filename2) ;
  44.           reval = FAIL ;
  45.           }
  46.          else
  47.          {
  48.           nblignes = LineReadWrite(fptr2, fptr1) ;
  49.            fclose(fptr1) ;
  50.           fclose(fptr2) ;
  51.          } ;
  52.          }
  53.         }
  54. return reval ;
  55. }

Reply

Marsh Posté le 24-10-2002 à 10:06:10    

alors que le passage par argument qui marche bien :
 

Code :
  1. /* Fichier.c Remove [a] Ver 1.2 14/10/2002 */
  2. #include <stdio.h>
  3. #include <string.h>
  4. enum {SUCCESS, FAIL, MAX_LEN = 200} ;
  5. void LineReadWrite(FILE *fin, FILE *fout) ;
  6. main (int argc, char *argv[])
  7. {
  8. FILE * fptr1, *fptr2 ;
  9. char filename1[200] = "ZZ_Done_ZZ_";
  10. char filename2[200] ;
  11. int reval = SUCCESS ;
  12. strcpy(filename2, argv[1]) ;
  13. strcat(filename1, argv[1]) ;
  14. if ((fptr1 = fopen(filename1, "w" )) == NULL)
  15. {
  16.  printf("Ecriture imposible dans %s.\n", filename1) ;
  17.  reval = FAIL ;
  18. }
  19. else
  20. {
  21.  if ((fptr2 = fopen(filename2, "r" )) == NULL)
  22.  {
  23.   printf("Ouverture imposible de %s.\n", filename2) ;
  24.   reval = FAIL ;
  25.  }
  26.  else
  27.  {
  28.   LineReadWrite(fptr2, fptr1) ;
  29.   fclose(fptr1) ;
  30.   fclose(fptr2) ;
  31.  } ;
  32. }
  33. return reval ;
  34. }

Reply

Marsh Posté le 24-10-2002 à 11:20:32    

Je viens d'essayer avec DIR au lieu de remove, mais en mettant "%f", ça marche ! (suis sous DOS de NT4).
 
Donc faudrait essayer  
for %f in (*.txt) do remove "%f"
 
Si le soft remove accepte les noms longs à espaces, c'est gagné.

Reply

Marsh Posté le 24-10-2002 à 15:35:43    

Merci Carbon j'ai reeusi a reparer mon programme deuxieme version ,)
 
Parcontre ta methode marche aussi ;)
 
Ca m'en ferra deux qui marche comme ca  :jap:

Reply

Sujets relatifs:

Leave a Replay

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