Gestion des répertoires
Rien d'innovant dans ces fonctions:
On peut se créer un répertoire, on utilisera pour cela la fonction CreateDirectory().
Attention, cette fonction n'est pas capable de créer toute une branche de répertoires. Il faut créer tous les répertoires intermédiaires s'ils n'existent pas avant de créer le dernier répertoire (la feuille de la branche).
Syntaxe:
BOOL CreateDirectory(
LPCTSTR lpPathName,
lpSecurityAttributes
);
Avec lpPathName pointeur sur une chaine de caractères qui contiendra le nom du nouveau répertoire
LPSECURITY_ATTRIBUTES pour les attributs de sécurités. Si NULL, alors se sera les valeurs par défaut.
Pour ces attributs, il faut d'abord vérifier que le volume (ou plutôt le file system) est bien capable de les gérer. On utilisera alors GetVolumeInformation() qui retournera returns FS_PERSISTENT_ACLS si les attributs sont gérés.
En sortie, la fonction retourne 0 si erreur.
La fonction GetLastError() retournera alors:
ERROR_ALREADY_EXISTS Si le répertoire existe déjà
ERROR_PATH_NOT_FOUND Si un répertoire intermédiaire n'existe pas
! On pourra alors utiliser la fonction SHCreateDirectoryEx().
On peut effacer un répertoire avec la fonction RemoveDirectory():
Attention: on ne peut effacer que des répertoires vides avec cette fonction. Donc si le répertoire contient d'autres répertoires ou d'autres fichiers, il faudra d'abord les supprimer ou alors utiliser la fonction SHFileOperation() qui fait tout...
Syntaxe:
BOOL RemoveDirectory(
LPCTSTR lpPathName
);
Cela se passe de commentaire...
En sortie, la fonction retourne 0 si erreur. On utilisera alors la fonction GetLastError() pour savoir ce qui c'est passé !
Connaître le répertoire courant:
GetCurrentDirectory() va permettre de connaître le répertoire utilisé actuellement par le processus.
Syntaxe:
DWORD GetCurrentDirectory(
DWORD nBufferLength,
LPTSTR lpBuffer
);
Avec nBufferLength qui contient la taille en TCHAR du buffer qui recevra le
répertoire courant.
lpBuffer un pointeur sur le buffer qui recevra le répertoire courant.
Si la fonction rencontre un erreur, elle retourne la valeur 0. On utilisera alors la fonction GetLastError() pour savoir ce qui c'est passé !
Sinon, il s'agit de longueur de la chaîne de caractères. Il faudra alors vérifier que cette taille n'est pas supérieure à la taille de notre buffer.
Si la taille est inférieure ou égale: Il s'agit de la taille utilisée (cette taille n'inclue pas le caractère NULL à la fin de la chaîne). Si elle est plus grande, il s'agit de la taille nécessaire dans le buffer pour contenir la chaîne de caractères (y compris le caractère NULL).
Remarque: Si vous passez 0 à nBufferLength et NULL à lpBuffer, vous obtiendrez alors la taille nécessaire pour votre buffer.Il sera alors possible de relancer cette fonction pour connaître le nom du réperoire courant tout en réservant la taille appropriée !
Fonctions similaires mais comme indiqué à la fin, dépassées:
Connaître le répertoire système de Windows:
UINT GetSystemDirectory(
LPTSTR lpBuffer,
UINT uSize
);
Bon, le nom des variables est différent, et le passage de paramètres n'est pas dans le même ordre, sinon, c'est tout pareil que la fonction précédente.
ou pour connaitre le réperoire de windows:
UINT GetWindowsDirectory(
LPTSTR lpBuffer,
UINT uSize
);
Là aussi, c'est tout pareil que la fonction précédente.
Enfin, le répertoire temporaire:
DWORD GetTempPath(
DWORD nBufferLength,
LPTSTR lpBuffer
);
Sans commentaire sur les noms changeant...
Cependant, pour les systèmes plus récents, il existe d'autres
répertoires comme Mes documents, ... Vous utiliserez donc plutôt
la fonction SHGetFolderPath()
Changer le répertoire courant:
Pour changer le réperoire courant de votre processus, vous utilisez:
BOOL SetCurrentDirectory(
LPCTSTR lpPathName
);
Si la fonction rencontre une erreur, elle retourne la valeur 0. Vous utiliserez la fonction GetLastError() pour savoir ce qui c'est passé !