Creer repertoire et sous repertoire

Résolu
sdisp Messages postés 75 Date d'inscription jeudi 27 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 - 18 mars 2005 à 09:52
sdisp Messages postés 75 Date d'inscription jeudi 27 janvier 2005 Statut Membre Dernière intervention 17 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.

3 réponses

sdisp Messages postés 75 Date d'inscription jeudi 27 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 1
21 mars 2005 à 18:33
Merci pour vos réponse mais je m'en suis sortie de cette facon:
(elle autorise l'usage du \ ou \\ ou / ou // pour le chemin)

#include <STDLIB.H>

char cheminComplet[256] ;
int indice ;
char chemin[256] ;
bool creationOk = false ;

/* Création du répertoire de sauvegarde */
while (!creationOk)
{
extern int errno ;


for( int y=0 ; y<256 ; y++ )
{
chemin[y] = '\0' ;
}
printf("\r\n") ;
printf ( "Ou voulez vous sauvegarder: ") ;
fflush(stdin);
gets(cheminComplet) ;
int x = strlen( cheminComplet ) ;
if( cheminComplet[x-1] != '\\' )
{
cheminComplet[x] = '\\' ;
cheminComplet[x+1] = '\0' ;
}
indice = 0 ;
while (cheminComplet[indice] != '\0')
{
if((cheminComplet[indice] == '\\') || (cheminComplet[indice] == '/')) // On cré le chemin de sauvegarde
{ // Etape par étape
if( indice != 2 )
{
for (int i=0 ; i<indice ; i++)
{
chemin[i] = cheminComplet[i] ;
}
_mkdir(chemin) ;
trouve = true ;
}
}
indice++ ;
}
if( errno != 0 && errno != 17)
{
printf("Le chemin doit etre sous cette forme:\n");
printf("c:\\td1\\tp2\n") ; // aussi \ ou \\ ou / ou // pour le chemin
}
else{
creationOk = true ;
}
}
3
Cornell711 Messages postés 26 Date d'inscription lundi 4 octobre 2004 Statut Membre Dernière intervention 20 juin 2005
18 mars 2005 à 19:14
On ne devrait pas avoir de problème avec ça http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/createdirectory.asp msdn est la solution à tous les problèmes.

@+
Cornell.
0
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 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 );
}


/* Valide l'existance du répertoire(1 s'il existe, sinon 0) */
return ( 0xffffffffu != GetFileAttributes( path ) );


}

char strPath[] = "c:\\rep1\\rep2\\rep3\\rep4";
BOOL bRetVal = MyMakeDir( strPath );

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

~(.:: NitRic ::.)~
0
Rejoignez-nous