IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Comment récupérer la cible d'un lien Symbolique ou d'une jonction sur Windows ?


Sujet :

Lazarus Pascal

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 16
    Points : 12
    Points
    12
    Par défaut Comment récupérer la cible d'un lien Symbolique ou d'une jonction sur Windows ?
    Bonjour,

    Je cherche à récupérer la target d'un lien Symbolique ou d'une jonction créée sous Windows.
    Voir ci-dessous les deux candidats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    16/04/2018  11:50    <JUNCTION>     TestJonction [j:\testlien]
    08/07/2018  17:31    <SYMLINKD>     TestSymLink [j:\testlien]
    J'arrive grâce à des instructions du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     attrs := FileGetAttr(fileName);
    et un test sur (attrs and faSymLink > 0) à déterminer que ces deux répertoires (TestJonction et TestSymLink) sont bien vus comme des Liens Symboliques, mais j'aurais besoin de pouvoir récupérer la cible ("J:\testlien" dans les deux cas).

    J'ai trouvé des pistes sous Linux mais aucune sous Windows.

    Avez-vous une astuce pour récupérer cette information ?

    D'avance merci pour votre aide.

  2. #2
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Bonsoir

    j'ai trouvé ça : https://blogs.msdn.microsoft.com/old...12-00/?p=14963 peut-être que cela t'aidera

    EDIT : Plus


    https://docs.microsoft.com/fr-fr/win...eattributesexa
    --> Symbolic link behavior—If the path points to a symbolic link, the function returns attributes for the symbolic link.
    https://stackoverflow.com/questions/...nks-on-windows
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  3. #3
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    voici une solution en utilisant Tprocess pour utiliser la commande dir et récupérer le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    // uses crt,classes,sysutils,process,lazutf8;
    var 
        target,myFolder,elem,name : String;
        AProcess: TProcess;
        AStringList,line : TStringList;
     
     
    begin
      myFolder :=  'M:\dev\Lazarus\';
      AProcess := TProcess.Create(nil);
      try
      AStringList := TStringList.Create;
      line := TStringList.Create;
      AProcess.Executable := 'cmd.exe';
      AProcess.Parameters.Add('/c');
      AProcess.Parameters.Add('dir');
      AProcess.Parameters.Add(myFolder);
      AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
      AProcess.Execute;
      AStringList := TStringList.Create;
      line := TStringList.Create;
      AStringList.LoadFromStream( AProcess.Output);
      writeln(ConsoleToUtf8(astringlist.Text)) ;
      For I:=0 to astringList.Count -1 do
      begin
      elem := ConsoleToUtf8(astringlist[I]);
      if (pos('<JUNCTION>',elem)> 0) or (pos('<SYMLINKD>',elem)> 0 ) then
         begin
           line.delimitedtext := elem;
           name := line[3];
           target := ExtractDelimited(2,elem,['[',']']);
           writeln('Nom : ' + name + ' - cible : ' + target);
         end;
      end;
     
     
      finally
      line.free;
      AStringList.Free;
      AProcess.Free;
      end;
    ConsoleToUTF8 permet de régler les problèmes d'accents de commande console sous windows. Il faut ajouter Lazutils dans les paquets requis pour pouvoir l'utiliser.
    Il peut y avoir des soucis si les noms de fichiers ou de répertoires contiennent des blancs, crochets, < >.
    On pourrait aussi utiliser les expressions régulières pour extraire les éléments

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  4. #4
    Membre à l'essai
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Merci BeanzMaster ,
    Je vais regarder cela.
    Je suis étonné qu'il n'y ait pas une unit qui permette de récupérer directement ces informations (on peut bien accéder aux attributs indiquant qu'il s'agit d'un lien..)

    Encore merci

  5. #5
    Membre à l'essai
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    hello,
    voici une solution en utilisant Tprocess pour utiliser la commande dir et récupérer le résultat :
    --- snip ----
    ConsoleToUTF8 permet de régler les problèmes d'accents de commande console sous windows. Il faut ajouter Lazutils dans les paquets requis pour pouvoir l'utiliser.
    Il peut y avoir des soucis si les noms de fichiers ou de répertoires contiennent des blancs, crochets, < >.
    On pourrait aussi utiliser les expressions régulières pour extraire les éléments

    Ami calmant, J.P
    Merci J-P , j'ai aussi envisagé de passer par une commande externe , mais je trouve bizarre qu'il n'existe pas de solutions permettant de le faire directement depuis FPC .
    Encore merci


    PS: je me pose ce problème car je cherche à pouvoir indiquer pour chaque drive la place occupée par un répertoire si il comporte des sous répertoires avec des liens .
    Si quelqu'un a une idée , je suis preneur.

    Merci à tous.

  6. #6
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Bonjour,
    Citation Envoyé par LeMontois Voir le message
    mais je trouve bizarre qu'il n'existe pas de solutions permettant de le faire directement depuis FPC .
    Encore merci
    Il n'y a rien de bizarre même Microsoft ne donne pas de solution à travers les API.
    L'autre chose à tester est la solution donnée dans le lien sur stackOverflow que j'ai donné. C'est en Python, cela ne devrait pas être trop dur à retranscrire pour FPC :

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    from win32file import *
    from winioctlcon import FSCTL_GET_REPARSE_POINT
     
    __all__ = ['islink', 'readlink']
     
    # Win32file doesn't seem to have this attribute.
    FILE_ATTRIBUTE_REPARSE_POINT = 1024
    # To make things easier.
    REPARSE_FOLDER = (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT)
     
    # For the parse_reparse_buffer function
    SYMBOLIC_LINK = 'symbolic'
    MOUNTPOINT = 'mountpoint'
    GENERIC = 'generic'
     
    def islink(fpath):
        """ Windows islink implementation. """
        if GetFileAttributes(fpath) & REPARSE_FOLDER == REPARSE_FOLDER:
            return True
        return False
     
     
    def parse_reparse_buffer(original, reparse_type=SYMBOLIC_LINK):
        """ Implementing the below in Python:
     
        typedef struct _REPARSE_DATA_BUFFER {
            ULONG  ReparseTag;
            USHORT ReparseDataLength;
            USHORT Reserved;
            union {
                struct {
                    USHORT SubstituteNameOffset;
                    USHORT SubstituteNameLength;
                    USHORT PrintNameOffset;
                    USHORT PrintNameLength;
                    ULONG Flags;
                    WCHAR PathBuffer[1];
                } SymbolicLinkReparseBuffer;
                struct {
                    USHORT SubstituteNameOffset;
                    USHORT SubstituteNameLength;
                    USHORT PrintNameOffset;
                    USHORT PrintNameLength;
                    WCHAR PathBuffer[1];
                } MountPointReparseBuffer;
                struct {
                    UCHAR  DataBuffer[1];
                } GenericReparseBuffer;
            } DUMMYUNIONNAME;
        } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
     
        """
        # Size of our data types
        SZULONG = 4 # sizeof(ULONG)
        SZUSHORT = 2 # sizeof(USHORT)
     
        # Our structure.
        # Probably a better way to iterate a dictionary in a particular order,
        # but I was in a hurry, unfortunately, so I used pkeys.
        buffer = {
            'tag' : SZULONG,
            'data_length' : SZUSHORT,
            'reserved' : SZUSHORT,
            SYMBOLIC_LINK : {
                'substitute_name_offset' : SZUSHORT,
                'substitute_name_length' : SZUSHORT,
                'print_name_offset' : SZUSHORT,
                'print_name_length' : SZUSHORT,
                'flags' : SZULONG,
                'buffer' : u'',
                'pkeys' : [
                    'substitute_name_offset',
                    'substitute_name_length',
                    'print_name_offset',
                    'print_name_length',
                    'flags',
                ]
            },
            MOUNTPOINT : {
                'substitute_name_offset' : SZUSHORT,
                'substitute_name_length' : SZUSHORT,
                'print_name_offset' : SZUSHORT,
                'print_name_length' : SZUSHORT,
                'buffer' : u'',
                'pkeys' : [
                    'substitute_name_offset',
                    'substitute_name_length',
                    'print_name_offset',
                    'print_name_length',
                ]
            },
            GENERIC : {
                'pkeys' : [],
                'buffer': ''
            }
        }
     
        # Header stuff
        buffer['tag'] = original[:SZULONG]
        buffer['data_length'] = original[SZULONG:SZUSHORT]
        buffer['reserved'] = original[SZULONG+SZUSHORT:SZUSHORT]
        original = original[8:]
     
        # Parsing
        k = reparse_type
        for c in buffer[k]['pkeys']:
            if type(buffer[k][c]) == int:
                sz = buffer[k][c]
                bytes = original[:sz]
                buffer[k][c] = 0
                for b in bytes:
                    n = ord(b)
                    if n:
                        buffer[k][c] += n
                original = original[sz:]
     
        # Using the offset and length's grabbed, we'll set the buffer.
        buffer[k]['buffer'] = original
        return buffer
     
    def readlink(fpath):
        """ Windows readlink implementation. """
        # This wouldn't return true if the file didn't exist, as far as I know.
        if not islink(fpath):
            return None
     
        # Open the file correctly depending on the string type.
        handle = CreateFileW(fpath, GENERIC_READ, 0, None, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT, 0) \
                    if type(fpath) == unicode else \
                CreateFile(fpath, GENERIC_READ, 0, None, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT, 0)
     
        # MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16384 = (16*1024)
        buffer = DeviceIoControl(handle, FSCTL_GET_REPARSE_POINT, None, 16*1024)
        # Above will return an ugly string (byte array), so we'll need to parse it.
     
        # But first, we'll close the handle to our file so we're not locking it anymore.
        CloseHandle(handle)
     
        # Minimum possible length (assuming that the length of the target is bigger than 0)
        if len(buffer) < 9:
            return None
        # Parse and return our result.
        result = parse_reparse_buffer(buffer)
        offset = result[SYMBOLIC_LINK]['substitute_name_offset']
        ending = offset + result[SYMBOLIC_LINK]['substitute_name_length']
        rpath = result[SYMBOLIC_LINK]['buffer'][offset:ending].replace('\x00','')
        if len(rpath) > 4 and rpath[0:4] == '\\??\\':
            rpath = rpath[4:]
        return rpath
     
    def realpath(fpath):
        from os import path
        while islink(fpath):
            rpath = readlink(fpath)
            if not path.isabs(rpath):
                rpath = path.abspath(path.join(path.dirname(fpath), rpath))
            fpath = rpath
        return fpath
     
     
    def example():
        from os import system, unlink
        system('cmd.exe /c echo Hello World > test.txt')
        system('mklink test-link.txt test.txt')
        print 'IsLink: %s' % islink('test-link.txt')
        print 'ReadLink: %s' % readlink('test-link.txt')
        print 'RealPath: %s' % realpath('test-link.txt')
        unlink('test-link.txt')
        unlink('test.txt')
     
    if __name__=='__main__':
        example()

    Citation Envoyé par LeMontois Voir le message
    PS: je me pose ce problème car je cherche à pouvoir indiquer pour chaque drive la place occupée par un répertoire si il comporte des sous répertoires avec des liens .
    Si quelqu'un a une idée , je suis preneur.

    Merci à tous.
    Avec les fonctions FindFirst, FindNext, tes liens seront lus comme des fichiers, si j'ai bien compris. Ensuite c'est à toi d'en tenir compte ou pas.
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Bonjour ! D'après cette discussion, il semblerait (si j'ai bien compris) que la fonction GetFinalPathNameByHandle réponde à votre problème.

    Malheureusement, je n'ai pas trouvé d'exemple de code en Pascal. Un exemple (non testé).
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  8. #8
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 418
    Points : 5 816
    Points
    5 816
    Par défaut
    salut

    petit discutions fort intéressante ici
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  9. #9
    Membre à l'essai
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par anapurna Voir le message
    salut

    petit discutions fort intéressante ici
    Merci Anapurna, mais il s'agit là de récupérer la cible d'un raccourci et non d'un lien symbolique.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Avec les fonctions FindFirst, FindNext, tes liens seront lus comme des fichiers, si j'ai bien compris. Ensuite c'est à toi d'en tenir compte ou pas.
    Oui effectivement, mais je vais repréciser mon besoin.
    J'ai un répertoire C:\Toto qui contient plusieurs sous-répertoires, certains étant locaux, d'autres des liens symboliques (ou jonctions) vers des répertoires sur d'autres drives.
    L'occupation disque des objets sous C:\Toto peut donc être du style :

    • X Gb sous C:\ (par tous les objets locaux) ;
    • Y Gb sous E:\ (car un sous-répertoire est un lien symbolique vers E:\Tata) ;
    • Z Gb sous F:\ (car un sous-répertoire est un lien symbolique vers F:\Titi et un autre une jonction vers F:\Tutu).

    Si on ne tient pas compte de ces répertoires particuliers, on a vite fait d'annoncer que C:\Toto occupe X+Y+ZGb sous C:\.
    Si on repère bien ces répertoires (Liens Symboliques et Jonctions) il faut aussi être capable d'extraire la cible de ces liens pour créditer le bon drive.
    Voilà, c'est toute ma problématique

  11. #11
    Membre à l'essai
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Bonjour ! D'après cette discussion, il semblerait (si j'ai bien compris) que la fonction GetFinalPathNameByHandle réponde à votre problème.

    Malheureusement, je n'ai pas trouvé d'exemple de code en Pascal. Un exemple (non testé).
    Bonjour Roland,

    Oui les fonctions de l'unité System.SysUtils me font baver , mais cette unité est dispo sur Delphi XE2.
    Peut-on la récupérer sous Lazarus et/ou CodeTyphon (IDE que j'utilise actuellement) ?

    Encore merci à tous pour votre collaboration .

  12. #12
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Je pense que c'est à vous de déclarer la fonction, comme cela est fait dans cet exemple :

    https://github.com/jrsoftware/issrc/...pawnServer.pas

    Bon courage !
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  13. #13
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Bonsoir, petite recherche dans les sources de fpc dans c:\lazarus\components\fpdebug\fpdbgwinclasses.pas

    on trouve ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    uses Windows; // pour GetProcAddress
     
    function TDbgWinProcess.GetModuleFileName(AModuleHandle: THandle): string;
    var
      u: UnicodeString;
      s: string;
      len: Integer;
      hMod: THandle;
      _GetFinalPathNameByHandle: function(hFile: HANDLE; lpFilename:LPWSTR; cchFilePath, dwFlags: DWORD):DWORD; stdcall;
    begin
      result := '';
     
      // normally you would load a lib, but since kernel32 is
      // always loaded we can use this (and we don't have to free it
      hMod := GetModuleHandle(kernel32);
      if hMod = 0 then Exit; //????
     
      // GetFinalPathNameByHandle is only available on Windows Vista / Server 2008
      _GetFinalPathNameByHandle := nil;
      pointer(_GetFinalPathNameByHandle) := GetProcAddress(hMod, 'GetFinalPathNameByHandleW');
      if assigned(_GetFinalPathNameByHandle) then begin
        SetLength(u, MAX_PATH);
     
        len := _GetFinalPathNameByHandle(AModuleHandle, @u[1], MAX_PATH, 0);
        s:='';
        if len > 0
        then begin
          SetLength(u, len - 1);
          if (u<>'') and (u[length(u)]=#0) then
          begin
            // On some older Windows versions there's a bug in GetFinalPathNameByHandleW,
            // which leads to a trailing #0.
            Delete(u,length(u),1);
          end;
          s:=UTF8Encode(u);
        end else begin
          u := '';
          LogLastError;
        end;
        // Remove the \\?\ prefix
        Delete(S,1,4);
        result := S;
      end;
    end;
    Cela devrais t'aider un peu
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  14. #14
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    Citation Envoyé par LeMontois Voir le message
    Oui effectivement, mais je vais repréciser mon besoin.
    J'ai un répertoire C:\Toto qui contient plusieurs sous-répertoires, certains étant locaux, d'autres des liens symboliques (ou jonctions) vers des répertoires sur d'autres drives.
    L'occupation disque des objets sous C:\Toto peut donc être du style :

    • X Gb sous C:\ (par tous les objets locaux) ;
    • Y Gb sous E:\ (car un sous-répertoire est un lien symbolique vers E:\Tata) ;
    • Z Gb sous F:\ (car un sous-répertoire est un lien symbolique vers F:\Titi et un autre une jonction vers F:\Tutu).

    Si on ne tient pas compte de ces répertoires particuliers, on a vite fait d'annoncer que C:\Toto occupe X+Y+ZGb sous C:\.
    Si on repère bien ces répertoires (Liens Symboliques et Jonctions) il faut aussi être capable d'extraire la cible de ces liens pour créditer le bon drive.
    Voilà, c'est toute ma problématique
    Je ne sais pas si c'est un impératif pour toi de le faire par programmation , mais il y a un utilitaire gratuit et open source qui permet de faire ce que tu veux :
    windirstat
    WinDirStat is a disk usage statistics viewer and cleanup tool for various versions of Microsoft Windows.
    Nom : M__Dev_Lazarus - WinDirStat.png
Affichages : 1521
Taille : 18,1 Ko

    Comme on peut le constater les liens symboliques et les jonctions sont à 0.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/06/2008, 16h57
  2. Réponses: 1
    Dernier message: 18/04/2008, 14h40
  3. Comment changer la cible d'un lien
    Par clement106 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 11/12/2007, 18h38
  4. Réponses: 13
    Dernier message: 07/05/2006, 11h54
  5. Réponses: 1
    Dernier message: 05/05/2006, 14h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo