|
auteur : Melem |
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).
|
|
auteur : Melem |
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 ;
}
|
|
|
auteur : Melem |
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 ;
}
|
|
|
auteur : Melem |
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).
|
|
auteur : Melem |
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;
CoInitialize (NULL );
if (SUCCEEDED (CoCreateInstance (& CLSID_ShellLink, NULL , CLSCTX_INPROC_SERVER, & IID_IShellLink,
(LPVOID * )& pIShellLink)))
{
pIShellLink- > lpVtbl- > SetPath (pIShellLink, " c:\\developpez\\tutos\\win32\\winapi.pdf " );
if (SUCCEEDED (pIShellLink- > lpVtbl- > QueryInterface (pIShellLink, & IID_IPersistFile,
(LPVOID * )& pIPersistFile)))
{
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 ?
|
|
auteur : Melem |
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;
CoInitialize (NULL );
if (SUCCEEDED (CoCreateInstance (& CLSID_ShellLink, NULL , CLSCTX_INPROC_SERVER, & IID_IPersistFile,
(LPVOID * )& pIPersistFile)))
{
pIPersistFile- > lpVtbl- > Load (pIPersistFile, L" c:\\winapi.lnk " , 0 );
if (SUCCEEDED (pIPersistFile- > lpVtbl- > QueryInterface (pIPersistFile, & IID_IShellLink,
(LPVOID * )& pIShellLink)))
{
char lpszPath[MAX_PATH];
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 ?
|
|
auteur : Melem |
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 " ,
" c:\\developpez\\test.txt " ,
NULL
);
return 0 ;
}
|
|
Consultez les autres F.A.Q.
Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protégée par les droits d'auteurs.
Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs :
- Les contributions de LFE sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies des contributions de LFE tant que cette note apparaît clairement :
"Ce document issu de http://www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement".
- Pour ce qui est des autres contributions : Copyright © 2002-2006 Developpez LLC : Tous droits réservés Developpez LLC. Aucune reproduction, ne peux en être faite sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.