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.

 

Image non trouvée !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...)

Image non trouvée !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).

Image non trouvée !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