sdisp
Messages postés75Date d'inscriptionjeudi 27 janvier 2005StatutMembreDernière intervention17 octobre 2008
-
18 mars 2005 à 09:52
sdisp
Messages postés75Date d'inscriptionjeudi 27 janvier 2005StatutMembreDernière intervention17 octobre 2008
-
21 mars 2005 à 18:33
Bonjour,
je souhaite permettre à l'utilisteur de mon programme d'entrer le repertoire de suvegarde de ses donnée.
Il devrai pouvoir entrer "c:\gdfjqd\jghfjghe\..."
Je me suis servie de mkdir() mais il ne fait pas les sous repertoire, dois-je chercher le caracter '\' et couper la chaine? Ou y a t'il une fonction toute faite.
Merci.
NitRic
Messages postés402Date d'inscriptionmardi 1 mai 2001StatutMembreDernière intervention15 août 2011 19 mars 2005 à 01:22
mkdir() sous Windows utilise CreateDirectory() tout comme une grande partie de la libc sous Windows utilise l'API Windows. J'ai eu un certain doute quand même alors j'ai essayé mais CreateDirectory() à échoué pour: CreateDirectory( "c:\\rep1\\rep2\", NULL ); étant donné que c:\\rep1\\ n'existe pas alors j'ai fais ce p'tit bout de code:
BOOL MyMakeDir( char * szPath )
{
char * path = szPath;
/* on valide seulement l'existance du répertoire si la chaine est vide */
if ( '\0' != *szPath )
{
/* si c'est un répertoire du genre: .\\rep1\\rep2 */
if ( '.' == *szPath )
{
/* on `skip`: .\\ */
szPath += 2;
}
/* si c'est un répertoire du genre: c:\\rep1\\rep2 */
else if ( ':' == *(szPath + 1) )
{
/* on `skip`: c:\\ */
szPath += 3;
}
do
{
do {
/* si c'est un backslash on sort */
if ( '\\' == *szPath )
{
break;
}
/* tant que l'on est pas à la fin de la chaine */
} while ( '\0' != *++szPath );
/* un backslash ici ... */
if ( '\\' == *szPath )
{
/* on met un '\0' à la place du backslash temporairement */
*szPath = '\0';
/****************************************************
*
cré le répertoire, on ne récupère pas
l'erreur s'il y en à une, car le répertoire
peu très bien exister mais il faut continuer
pour créer les sous-répertoires
*
****************************************************/
CreateDirectory( path, NULL );
/* remet le backslash à sa place(retire le '\0') */
*szPath++ = '\\';
}
}
while ( '\0' != *szPath );
/***************************************
*
La chaine peu très bien ne
pas ce terminer par un backslash
alors on tente une création final
Si on avait une chaine du genre:
- c:\\rep1\\rep2\\rep3
Dans la boucle, il n'y à que:
- c:\\rep1\\rep2\\
de créé, alors il faut créer `rep3`
- c:\\rep1\\rep2\\rep3
*
***************************************/
CreateDirectory( path, NULL );
}
ce n'est rien d'extraordinaire mais ca fonctionne avec des répertoires du genre:
c:\\rep1\\rep2\\rep3\\
ou
c:\\rep1\\rep2
ou
.\\rep1\\rep2\\
ou
.\\rep1\\rep2
etc ...
ATTENTION:
- Pas de nom de répertoire du genre: c:rep1\\rep2\\ <<il manque un backslash ici, ca va planter s'il est manquant
- Même chose avec le répertoire courant: .rep1\\rep2\\ etc ...
En gros, la chaine doit commencer soit par `[lecteur]:\\` ou par `.\\`
exemples:
- c:\\rep1
- d:\\rep1\\rep2\\rep3\\rep4
- .\\rep1\\rep2\\rep3
- .\\rep1
- etc ...