FAQ Win32Consultez toutes les FAQ

Nombre d'auteurs : 11, nombre de questions : 72, dernière mise à jour : 2 septembre 2018 

 
OuvrirSommaireLes fichiers et les dossiers

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).

Mis à jour le 25 mars 2009  par 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.

 
Sélectionnez
#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;
}
Créé le 28 juillet 2008  par 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.

 
Sélectionnez
#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;
}
Créé le 28 juillet 2008  par 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.

 
Sélectionnez
#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).

Créé le 28 juillet 2008  par 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).

 
Sélectionnez
#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;
}
Créé le 28 juillet 2008  par Melem

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.

 
Sélectionnez
#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;
}
Créé le 25 mars 2009  par Melem

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.

 
Sélectionnez
#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;
}
Créé le 28 juillet 2008  par Melem
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 Developpez.com Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.