Compléments sur les fichiers
Lire les attributs d'un fichier
DWORD GetFileAttributes(
LPCTSTR lpFileName
);
En entrée, lpFilaName est le nom du fichier terminé par \000 pour lequel on désire connaître ses attributs.
En sortie:
Si la valeur est FFFFFFFF, alors il y a erreur.
sinon, les valeurs peuvent être trouvées ici: Les attributs d'un fichier ou d'un réperoire:
Obtenir des informations complémentaires sur un fichier:
BOOL GetFileInformationByHandle(
HANDLE hFile,
LPBY_HANDLE_FILE_INFORMATION lpFileInformation
);
hFile: Handle sur un fichier. (Ne marche pas sur un pipe !)
lpFileInformation Structure de type BY_HANDLE_FILE_INFORMATION
En sortie
Si la fonction ne se plante pas, la valeur est différente de 0, sinon à 0 et utilisez GetLastError !
ou
BOOL GetFileAttributesEx(
LPCTSTR lpFileName,
GET_FILEEX_INFO_LEVELS fInfoLevelId,
LPVOID lpFileInformation
);
Avec en entrée:
lpFileName Chaîne de caractères indiquant le fichier ou répertoire (Taille maxi MAX_PATH qu'il est possible d'étendre. Pour plus d'information, voir chez Microsoft)
fInfoLevelId Normalement, on indique ici le type d'information que l'on veut
récupérer, mais il n'existe actuellement qu'une valeur: GetFileExInfoStandard:Ou
lpFileInformation devra être une structure de type WIN32_FILE_ATTRIBUTE_DATA.
lpFileInformation Pointeur sur un tampon qui recevra les attributs demandés.
En sortie, 0 si erreur et on utilisera GetLastError.
Effacer un fichier
Vous utiliserez la fonction DeleteFile()
BOOL DeleteFile(
LPCTSTR lpFileName
);
Avec lpFileName qui pointe sur le nom d'un fichier.
La fonction retourne 0 si echec.
Attention, la suppression est alors définitive.
Comme toujours, cette fonction n'efface qu'un seul fichier. Mais il existe une fonction permettant de supprimer des fichiers récursivement dans un répertoire:SHFileOperation(). De même, vous utiliserez cette fontion pour envoyer les fichiers à la corbeille.
Déplacer un fichier
MoveFileEx()
Copier/Dupliquer un fichier
CopyFileEx()
Renommer un fichier
Utilisez MoveFileEx()
Une fonction à tout faire (copier, déplacer, effacer, envoyer à la corbeille):
La fonction SHFileOperation
Cette fonction permet de faire des copies ou déplacements, de renommer, ou effacer (définitivement ou en envoyant à la corbeille) des fichiers.
int SHFileOperation(
LPSHFILEOPSTRUCT lpFileOp
);
Les paramètres:
lpFileOp C'est une structure qui va contenir tous les paramètres comme le type d'opération, l'utilisation ou non des dialogues de confirmations, la liste des fichiers, opération récurcive ou non...
En sortie, la fonction retourne 0 si tout est ok.
La structure utilisée est:
typedef struct _SHFILEOPSTRUCT {
HWND hwnd;
UINT wFunc;
LPCTSTR pFrom;
LPCTSTR pTo;
FILEOP_FLAGS fFlags;
BOOL fAnyOperationsAborted;
LPVOID hNameMappings;
LPCTSTR lpszProgressTitle;
} SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;
Avec:
hwnd handle sur une window pour afficher des informations sur l'état
de l'opération sur les fichiers.
wFunc : Le type de fonction à faire:
Valeur | Description |
FO_COPY | Copier des fichiers de pFrom vers pTo |
FO_DELETE | Effacer des fichiers (définitivement ou vers la corbeille) de pFrom |
FO_MOVE | Déplacer des fichiers de pFrom vers pTo |
FO_RENAME | Renommer 1 fichier (et seulement 1). Voir avec FO_MOVE éventuellement pour multiples fichiers |
pFrom Adresse sur un buffer contenant 1 ou plusieurs fichiers. Les jokers sont
utilisables. Chaque nom de fichiers doit se terminer par un caractère
\000. Pour indiquer la fin de la liste, il faut encore ajouter un caractère
\000.
pTo Comme pFrom, sauf que les jokers sont interdits. Doit être à NULL si l'opération n'utilise pas de pTo. Remarque : Pour les opérations Copy ou Move, le répertoire de destination ne doit pas forcement exister. Dans ce cas, le système essayera de le créer. Vous pourrez de même indiquer plusieurs répertoires de destinations si l'option FOF_MULTIDESTFILES est indiquée dans fFlags.
Concernant pFrom
et pTo, il est vivement conseillé d'utiliser des noms de chemin en absolue.
fFlags : liste des options à faire durant l'opération désirée:
Valeur | Description |
FOF_ALLOWUNDO | Si possible, permettre le undo. (attention chemin doit être absolue, sinon le flag est ignoré. Donc un simple nom de fichier va effacer définitivement celui-ci). C'est ce flag qui va vous permettre d'envoyer des fichiers à la corbeille. |
FOF_CONFIRMMOUSE | Ne sert à rien... |
FOF_FILESONLY | Ne faire l'opération que sur les fichiers si un joker est utilisé |
FOF_MULTIDESTFILES | pTo va alors spécifier la destination de chaques fichiers. |
FOF_NOCONFIRMATION | Réponse "oui" à tous. Ce qui permet de ne pas afficher les messages de confirmation du système. (Par exemple : Confirmez-vous l'envoi du fichier à la corbeille ?") |
FOF_NOCONFIRMMKDIR | Ne pas confirmer la création d'un nouveau répertoire si l'opération requière la création du dit répertoire. |
FOF_RENAMEONCOLLISION | Renommer le fichier en cours si il en existe déjà un du même nom |
FOF_NOCOPYSECURITYATTRIBS | Ne pas recopier les attributs de sécurité d'un fichier |
FOF_NOERRORUI | Ne pas afficher de message si une erreur vient à ce produire pendant l'opération |
FOF_NORECURSION | Ne pas faire de traitements récursifs |
FOF_SILENT | Ne pas afficher de barre de progression |
FOF_SIMPLEPROGRESS | Afficher une dialogue de progression sans afficher le nom des fichiers |
fAnyOperationsAborted : Ce champ reçoit TRUE si l'utilisateur a abandonner
l'opération. FALSE sinon.
hNameMappings Ce champ est utilisé pour le cas où vous auriez
des fichiers renommés (cas de doublon) avec l'option FOF_WANTMAPPINGHANDLE.
Voir chez Microsoft...
lpszProgressTitle : Adresse sur une chaîne de caractères à
utiliser comme titre. Ne marche qu'avec FOF_SIMPLEPROGRESS
Voici un exemple qui utilise le "drag and drop" pour envoyer des fichiers directement à la corbeille: Il suffit d'ouvrir un explorateur et de glisser des fichiers sur la fenêtre. (je sais, cela ne sert pas à grand chose...)
Pour
que ce soit Windows qui demande confirmation, il suffit de retirer l'option
FOF_NOCONFIRMATION dans le flag et virer le code qui fait la même chose
en moins beau dans le programme.
Générer un nom de fichier de travail:
GetTempFileName()
Création de répertoires en cascade:
SHCreateDirectoryEx()
Cette fonction va permettre de créer tous les répertoires qui n'existent pas dans le chemin indiqué (Attention, cela doit être un chemin absolu et non relatif !).
int SHCreateDirectoryEx(
HWND hwnd,
LPCTSTR pszPath,
SECURITY_ATTRIBUTES *psa
);
hwnd Eventuellement un handle sur la fenêtre ou NULL. Si un handle est
passé, la fonction pourra alors afficher des messages d'erreur.
pszPath chemin avec les répertoires à créer (Maximum 248
caractères avec le 0 en fin de chaines inclus).
psa Pointe sur une structure de type SECURITY_ATTRIBUTES. Peut être positionné
à NULL.
En sortie, la fonction peut retourner:
Valeur | Désignation |
ERROR_SUCCESS | Pas d'erreur ! |
ERROR_BAD_PATHNAME | Utilisation d'un chemin relatif interdit |
ERROR_FILENAME_EXCED_RANGE | Taille du chemin > 248 caractères |
ERROR_PATH_NOT_FOUND | Chemin nontrouvé |
ERROR_FILE_EXISTS | Un fichier porte déjà le nom ! |
ERROR_ALREADY_EXISTS | Le répertoire existe déjà ! |
ERROR_CANCELLED | Abandon de la part de l'utilisateur |
Répertoire système et personnel:
SHGetSpecialFolderPath()
Cette fonction va retourner les chemins des différents répertoires du système ou répertoires spécifiques à un utilisateur (par exemple Mes Documents).
Pour utiliser cette
fonction, vous aurez besoin de l'include shlobj.h et de la librairie shell32.lib
En entrée:
hwndOwner handle sur fenêtre
lpszPath Pointeur sur un buffer qui recevra le chemin complet du répertoire
demandé. Utiliser donc MAX_PATH comme taille !
nFolder une valeur CSIDL qui va permettre
d'indiquer le répertoire qui vous intéresse. Attention, cette
fonction va échouer sur les répertoires virtuelles !
fCreate Pour indiquer s'il faut créer le répertoire s'il n'existe
pas ou non (dans ce cas, la valeur devra être à NULL).
En sortie:
TRUE si ok, FALSE si erreur.
Concernant les différentes valeurs de CSIDL, voir annexe CSIDL
Indiquer les fichiers récemments utilisés:
SHAddToRecentDocs()
Cette fonction permet à une application d'indiquer l'utilisation récente d'un fichier.
Elle crée une nouvelle entrée dans le répertoire des fichiers récemments utilisés par un utilisateur (Généralement C:\Documents and Settings\utilisateur\Recent). Cette fonction permet surtout d'informer le système qui pourra mettre à jour par exemple l'entrée "Mes documents récents" qu'il y a derrière le bouton démarrer.
void SHAddToRecentDocs(
UINT uFlags,
LPCVOID pv
);
En entrée:
uFlags un flag pour indiquer au système comment utiliser le paramètre
suivant
SHARD_PATH Indique que pv pointe sur un chemin et fichier
SHARD_PIDL Pointe sur un pointeur sur un item identifier (PIDL)
pv Pointeur sur la chaîne de caractères terminée par NULL
pour un chemin + fichier si SHARD_PATH, ou un PIDL. Si NULL, efface tous les
documents de la liste.
En sortie:
Rien