IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Les fichiers et les dossiers
        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 ?



Comment faire ceci ou cela sur un fichier ou un dossier ?
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).


Comment lister le contenu d'un dossier ?
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;
}

Comment décomposer un chemin ?
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;
}

Comment connaître le chemin d'un emplacement spécial comme Program Files ou Mes documents par exemple ?
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).


Comment créer un raccourci vers un fichier ou un dossier ?
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;

    /* 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 : faq Qu'est-ce que COM ?

Comment connaître le chemin du fichier ou du dossier pointé par un raccourci ?
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;

    /* 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 : faq Comment créer un raccourci vers un fichier ou un dossier ?
lien : faq Comment récupérer la valeur d'une variable d'environnement ?

Comment créer un lien dur vers un fichier ?
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",             /* Lien dur à créer      */
                    "c:\\developpez\\test.txt", /* Lien dur existant     */
                    NULL                        /* Attributs de sécurité */
    );

    return 0;
}


Consultez les autres F.A.Q's


Valid XHTML 1.0 TransitionalValid CSS!

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.