FAQ Win32
FAQ Win32Consultez toutes les FAQ
Nombre d'auteurs : 11, nombre de questions : 72, dernière mise à jour : 16 juin 2021
- Comment faire ceci ou cela sur un fichier ou un dossier ?
- Comment lister le contenu d'un dossier ?
- Comment décomposer un chemin ?
- Comment connaître le chemin d'un emplacement spécial comme Program Files ou Mes documents par exemple ?
- Comment créer un raccourci vers un fichier ou un dossier ?
- Comment connaître le chemin du fichier ou du dossier pointé par un raccourci ?
- Comment créer un lien dur vers un fichier ?
Voici un rappel de quelques fonctions courantes de manipulation de fichier ou de dossier. Un nom de fichier ou de dossier peut être le nom seulement s'il se trouve dans le répertoire courant du processus (qui est par défaut le répertoire de l'exe).
Fonction | Description |
---|---|
CopyFile | Copie un fichier. Exemple : CopyFile("c:\\source\\fichier.exe", "c:\\dest\\fichier.exe", 0); |
MoveFile | Renomme ou déplace un fichier ou un dossier. Exemple : MoveFile("old.log", "new.txt"); |
DeleteFile | Supprime un fichier. Exemple : DeleteFile("temp.txt"); |
CreateDirectory | Crée un nouveau dossier. Exemple : CreateDirectory("tmp", NULL); |
RemoveDirectory | Supprime un dossier s'il est vide. Exemple : RemoveDirectory("tmp"); |
GetFileAttributes | Retourne les différents attributs (caché, système, lecture seule, etc.) d'un fichier ou d'un dossier. |
SetFileAttributes | Modifie les attributs d'un fichier ou d'un dossier. |
GetFileSizeEx | Permet de connaître la taille d'un fichier. |
Ces fonctions sont toutes fois trop "bas niveau" et ne permettent pas la réalisation d'une tâche pourtant simple comme copier un répertoire avec tous ses fichiers et sous-répertoires par exemple. Pour faire ce genre d'opération, utilisez plutôt SHFileOperation (inclure shellapi.h).
La fonction FindFirstFile permet de trouver le premier fichier ou dossier dont le nom satisfait une condition donnée, appelée filtre. Pour énumérer tout le contenu d'un dossier (tous les fichiers et tous les dossiers - n'entre pas dans les sous dossier), il suffit d'utiliser "*.*" (ou "<chemin>\\*.*") comme filtre. Le programme suivant liste le contenu de son dossier courant.
#include <stdio.h>
#include <windows.h>
int
main
(
)
{
HANDLE hEnt;
WIN32_FIND_DATA ent;
if
((
hEnt =
FindFirstFile
(
"
*.*
"
, &
ent)) !=
INVALID_HANDLE_VALUE)
{
do
printf
(
"
%s
\n
"
, ent.cFileName);
while
(
FindNextFile
(
hEnt, &
ent));
FindClose
(
hEnt);
}
return
0
;
}
A l'aide de la fonction _splitpath de la CRT ou, si vous utilisez une version assez récente de MSVCRT (à partir de 8.0), à l'aide de _splitpath_s.
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int
main
(
)
{
char
szFullPath[MAX_PATH], drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
GetModuleFileName
(
NULL
, szFullPath, sizeof
(
szFullPath));
printf
(
"
Chemin complet : %s
\n
"
, szFullPath);
_splitpath
(
szFullPath, drive, dir, fname, ext);
printf
(
"
Lecteur : %s
\n
"
, drive);
printf
(
"
Repertoire : %s
\n
"
, dir);
printf
(
"
Nom du fichier : %s
\n
"
, fname);
printf
(
"
Extension : %s
\n
"
, ext);
return
0
;
}
A l'aide de la fonction SHGetFolderPath. Il s'agit d'une fonction du Shell. Il faut inclure shlobj.h et se lier avec shell32.lib pour l'utiliser. Le programme suivant affiche le chemin du dossier Mes documents.
#include <stdio.h>
#include <windows.h>
#include <shlobj.h>
int
main
(
)
{
char
szPath[MAX_PATH] =
""
;
SHGetFolderPath
(
NULL
, CSIDL_PERSONAL, NULL
, 0
, szPath);
printf
(
"
%s
\n
"
, szPath);
return
0
;
}
Pour récupérer le chemin vers le répertoire de Windows ou le répertoire système (system32), il y a également les fonctions GetWindowsDirectory et GetSystemDirectory
bien qu'on puisse toujours les récupérer à l'aide de SHGetFolderPath (en utilisant respectivement CSIDL_WINDOWS et CSIDL_SYSTEM).
Cela peut se faire en utilisant les interfaces IShellLink et IPersistFile de la classe ShellLink. La classe ShellLink représente un fichier "raccourci" ("shell link").
Les interfaces IShellLink et IPersistFile exposent des fonctions permettant respectivement de manipuler un "raccourci" en tant que raccourci proprement dit
et en tant que fichier sur disque (car un raccourci est avant tout un fichier (*.lnk)).
Le code suivant, écrit en C (ne compile pas en C++),
montre un exemple d'utilisation de ces interfaces. Il n'est pas difficile de le traduire dans un autre langage (C++ ou n'importe quel autre langage
supportant COM).
#include <windows.h>
#include <shlobj.h>
int
main
(
)
{
IShellLink *
pIShellLink;
IPersistFile *
pIPersistFile;
/* Initialisons la bibliothèque *COM* */
CoInitialize
(
NULL
);
/* Créons une instance de la classe ShellLink (dont l'ID est CLSID_ShellLink) */
/* et utilisons son interface IShellLink */
if
(
SUCCEEDED
(
CoCreateInstance
(&
CLSID_ShellLink, NULL
, CLSCTX_INPROC_SERVER, &
IID_IShellLink,
(
LPVOID *
)&
pIShellLink)))
{
/* La méthode SetPath de l'interface IShellLink permet de définir le chemin du fichier */
/* ou dossier à pointer */
pIShellLink->
lpVtbl->
SetPath
(
pIShellLink, "
c:
\\
developpez
\\
tutos
\\
win32
\\
winapi.pdf
"
);
/* Utilisons maintenant l'interface IPersistFile du même objet */
if
(
SUCCEEDED
(
pIShellLink->
lpVtbl->
QueryInterface
(
pIShellLink, &
IID_IPersistFile,
(
LPVOID *
)&
pIPersistFile)))
{
/* La méthode Save de l'interface IPersistFile permet d'enregistrer un objet (ici notre racourci) */
/* sur le disque */
pIPersistFile->
lpVtbl->
Save
(
pIPersistFile, L"
c:
\\
winapi.lnk
"
, 0
);
pIPersistFile->
lpVtbl->
Release
(
pIPersistFile);
}
pIShellLink->
lpVtbl->
Release
(
pIShellLink);
}
CoUninitialize
(
);
return
0
;
}
Lien : Qu'est-ce que COM ?
Le programme suivant affiche le chemin du fichier ou du dossier pointé par le raccourci sans interprétation supplémentaire. Il se peut par exemple que le chemin du fichier ou du dossier contienne une variable d'environnement (%systemroot% par exemple), notre programme ne développera pas cette variable.
#include <stdio.h>
#include <windows.h>
#include <shlobj.h>
int
main
(
)
{
IShellLink *
pIShellLink;
IPersistFile *
pIPersistFile;
/* Initialisons la bibliothèque *COM* */
CoInitialize
(
NULL
);
/* Créons une instance de la classe ShellLink (dont l'ID est CLSID_ShellLink) */
/* et utilisons son interface IIPersistFile */
if
(
SUCCEEDED
(
CoCreateInstance
(&
CLSID_ShellLink, NULL
, CLSCTX_INPROC_SERVER, &
IID_IPersistFile,
(
LPVOID *
)&
pIPersistFile)))
{
/* La méthode Load de l'interface IPersistFile permet de charger un fichier situé sur le dique */
pIPersistFile->
lpVtbl->
Load
(
pIPersistFile, L"
c:
\\
winapi.lnk
"
, 0
);
/* Utilisons maintenant l'interface IShellLink du même objet */
if
(
SUCCEEDED
(
pIPersistFile->
lpVtbl->
QueryInterface
(
pIPersistFile, &
IID_IShellLink,
(
LPVOID *
)&
pIShellLink)))
{
char
lpszPath[MAX_PATH];
/* La méthode GetPath de l'interface IShellLink permet de récupérer le chemin du fichier */
/* ou dossier pointé par un raccourci */
pIShellLink->
lpVtbl->
GetPath
(
pIShellLink, lpszPath, sizeof
(
lpszPath), NULL
, SLGP_RAWPATH);
printf
(
"
%s
\n
"
, lpszPath);
pIShellLink->
lpVtbl->
Release
(
pIShellLink);
}
pIPersistFile->
lpVtbl->
Release
(
pIPersistFile);
}
CoUninitialize
(
);
return
0
;
}
Lien : Comment créer un raccourci vers un fichier ou un dossier ?
Lien : Comment récupérer la valeur d'une variable d'environnement ?
Tout d'abord, chaque entrée d'un répertoire représentant un fichier n'est pas "le fichier" lui-même mais un "lien dur" vers le véritable fichier stocké sur le disque. Le système de fichier NTFS ainsi que ses dérivés permettent de créer un nouveau lien dur vers un fichier en copiant les informations contenues dans un lien dur existant. La fonction permettant de créer un lien dur vers un fichier est CreateHardLink. Cette fonction n'étant disponible qu'à partir de Windows 2000, il faut définir la valeur de la macro _WIN32_WINNT à 0x0500 avant d'inclure windows.h.
#define _WIN32_WINNT 0x0500
#include <windows.h>
int
main
(
)
{
CreateHardLink
(
"
c:
\\
test.txt
"
, /* Lien dur à créer */
"
c:
\\
developpez
\\
test.txt
"
, /* Lien dur existant */
NULL
/* Attributs de sécurité */
);
return
0
;
}