Convertir chemin d'un fichier

Signaler
Messages postés
298
Date d'inscription
jeudi 12 juin 2003
Statut
Membre
Dernière intervention
9 juillet 2008
-
Messages postés
75
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
3 juillet 2006
-
bonjour,
une fonction me retorune un chemin sous format :
/physicaldrive/mondossier/fichier1 (je me rappelle pas exactement, mais c'est pas loin de ça, ça doit etre physicaldrive0 pour les fichier de la partition c)
alors je veux le convertir en c:\mondossier\fichier1
(win32 api)
merci

7 réponses

Messages postés
75
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
3 juillet 2006

/*

* 2006/04/13

*

* main.c

*

*/

#include <ctype.h> /* isdigit() */

#include <stdio.h> /* puts() */

#include <stdlib.h> /* atoi()/free() */

#include <string.h> /* _strdup() */



/*

* constantes

*/

static const char _DRIVE[] = {/*'A', 'B',*/

'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',\

'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};

#define _DRIVE_COUNT ((sizeof(_DRIVE) / sizeof(_DRIVE[0])) - 1)



static const char* _PHYSICAL_DRIVE = "physicaldrive";

#define _PHYSICAL_DRIVE_LENGTH (sizeof("physicaldrive") - 1)



/*

* fonctions locales

*/

static __inline void __stdcall _slash_to_backslash(char* string);

static int __stdcall _convert_pathname(char* pathname);



/*

* main()

*/

int __cdecl main()

{

char* path = _strdup("/physicaldrive0/dossier 1/dossier 2/mon fichier.txt");

//char* path = _strdup("test");

//char* path = _strdup("////test/////");

//char* path = _strdup("/physicaldrive1234\\test");

//char* path = _strdup("/physicaldrive////");

//char* path = _strdup("physicaldrive121/dossier 1/dossier 2/mon fichier.txt");



_convert_pathname(path);

puts(path);



free(path);

return 0;

}



/*

* remplace tous les '/' par des '\\'

*/

static __inline void __stdcall _slash_to_backslash(char* string)

{

for (; *string != '\0'; string++)

{

if (*string == '/') {

*string = '\\';

}

}

}



/*

* from:

* - [/]physicaldrive<N>[/folder1[/folder2/...]]

* to:

* - <D>:\\[folder1[\\folder2[\\...]]]

*

* <N> => Number

* <D> => Drive

*

*/

static int __stdcall _convert_pathname(char* pathname)

{

unsigned drive_index;

char* left = pathname;



_slash_to_backslash(pathname);



if (*pathname == '\\') {

pathname++;

}

if (_strnicmp(pathname, _PHYSICAL_DRIVE, _PHYSICAL_DRIVE_LENGTH) == 0)

{

/* skip « physicaldrive » */

pathname += _PHYSICAL_DRIVE_LENGTH;



if ( isdigit(*(unsigned char*)pathname) )

{

if
((drive_index = (unsigned)atoi(pathname)) > _DRIVE_COUNT) {

drive_index = _DRIVE_COUNT;

}

/* skip number */

while ( isdigit(*(unsigned char*)pathname) ) {

pathname++;

}

*left++ = _DRIVE[drive_index];

*left++ = ':';



while ((*left++ = *pathname++) != '\0') {

/*nothing*/

}

return 1; /* SUCCESS */

}

/*

else {

return 0; // ERROR: invalid drive number

}

*/

}

return 0; /* ERROR: invalid pathname */

}



/****************************************************/



C:\dossier 1\dossier 2\mon fichier.txt

Press any key to continue





-=-= ExCRT =-=-
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
A quoi sert le tableau _DRIVE[] ???

*left++ = _DRIVE[drive_index];
deviendrait: *left++ = drive_index + 'C';

ciao...
BruNews, MVP VC++
Messages postés
75
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
3 juillet 2006

oui, tout a fait

-=-= ExCRT =-=-
Messages postés
298
Date d'inscription
jeudi 12 juin 2003
Statut
Membre
Dernière intervention
9 juillet 2008
1
je vous remercie pour votre effort mais ce que je demande c'est tout simplement une fonction API pour convertir le chemin de "device\harddisk0\mondossier\fichier" (je me suis trompé au début) à "c:\mondossier\fichier".
il y a certainement une fonction pour le faire sans implémenter tous ces lignes de code, le chemin "device\harddisk0\..." que je cherche à convertir est renvoyé par la fonction API getMappedFile (si je me rappelle bien).
j'ai testé qq fonctions que j'ai trouvé dans la section "path" et "drive" de la documentation MSDN mais ça n'a pas marché
(c'est du win32api non pas du turbo c ;) )

je vous remercie encore une fois pour votre effort, il sont de plus en plus rares les développeurs qui sont préts à sacrifier bcp de temps pour répondre à des questions sur ce forum.
Messages postés
75
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
3 juillet 2006

rien à voir avec « TurboC », c'est du C carrément. L'API Windows est elle-même codé en C et en C++. « TurboC » n'est pas un langage mais un compilateur ... Je ne crois pas que tu puisse trouver une fonction dans l'API Windows qui permet de convertir ton « path » mais, bonne recherche ...

-=-= ExCRT =-=-
Messages postés
298
Date d'inscription
jeudi 12 juin 2003
Statut
Membre
Dernière intervention
9 juillet 2008
1
je préfére ne pas orienter la déscussion à qq chose d'inutile, j'ai une question et je cherche une réponse, si tu n'as pas une information utile ferme cette page et cherche ailleur. me reste à te signaler que c'est pas à toi de me montrer la différence entre un langage et un compilateur ou ide, et si je l'ai dit dans mon msg c'est pour la simple raison que j'aime appeler comme ça tout programme du genre.
Messages postés
75
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
3 juillet 2006

ooohhhh mais on ce calme mon petit ... si tu n'aimes pas cette « petite remarque », c'est ton problème. je n'ai pas crié, je ne t'ai pas insulté, ni rien d'autre du genre, alors prends une grande inspiration et expire lentement ... TurboC est un compilateur et non un langage(il n'y a rien de méchant/insultant/... dans cette phrase).

-=-= ExCRT =-=-