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

Composants FMX Delphi Discussion :

Un filebrowser maison me pose problème


Sujet :

Composants FMX Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut Un filebrowser maison me pose problème
    Bonjour,

    pour les besoins d'un programme je me suis fait un filebrowser maison, a priori quand je l'exécute au sein de mon programme j'ai des fuites mémoires
    Pourquoi un filebrowser maison ? parce que je voulais chercher par exemple : les fichiers .TXT ou (inclusif) .CSV

    Donc pour voir d'où venaient les fuites j'ai isolé cette partie dans un autre programme que je vous livre en Zip ProjectBrowser.zip

    , pas de fuites ! le problème est ailleurs

    Toutefois, en testant je suis tombé sur un soucis : les répertoires spéciaux genres "mes images" "ma musique" etc. n'existant pas sous ces noms ! Ce n'est pas une question d'espaces car j'ai un répertoire dont le nom contient des espaces qui s'ouvre correctement.

    Le coupable est bien TDirectory.GetDirectories qui me fourni le nom "vulgaire"
    Comment faire pour "réinterpréter" ces noms ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 696
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 696
    Points : 13 135
    Points
    13 135
    Par défaut
    Avec SHGetFileInfo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    uses ShellAPI;
     
    function GetFolderAlias(const aPath :TFileName) :string;
    var
      FileInfo :TSHFileInfo;
    begin
      if SHGetFileInfo(PChar(aPath), 0, FileInfo, SizeOf(FileInfo), SHGFI_DISPLAYNAME) <> 0
      then Result := FileInfo.szDisplayName
      else Result := aPath;
    end;

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    merci pour cette réponse mais ça n'a pas l'air d'être cette fonction
    En fait elle me renvoie (pour un quelconque répertoire d'ailleurs) le nom du répertoire

    i.e : GetFolderAlias('C:\users\public\interbase') -> Interbase
    GetFolderAlias('C:\users\public\Ma musique') -> Ma musique
    GetFolderAlias('C:\users\public\My music') -> My music

    Je pense que la piste est plutôt dans l'obtention :
    • soit de la liste des KNOWNFOLDERS.
    • soit du GUID (CLSID ?) des dossiers.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 696
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 696
    Points : 13 135
    Points
    13 135
    Par défaut
    Parce qu'il n'y a pas d'alias. Chez moi, il n'y a d'ailleurs pas de répertoire My Music, mais Music tout court.

    Testé sous Windows 10 et pas de soucis :

    C:\Users\<Utilisateur>\Music -> Musique
    C:\Users\Public\Music -> Musique publique
    C:\Users -> Utilisateurs

  5. #5
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    D'après ce que j'ai pu lire avec le FileAttributes, la propriété ReparsePoint permet de savoir si c'est un lien symbolique.

    Il y a peut être moyen de convertir un lien symbolique en lien normal ?

    Sinon faire ta propre fonction récursive pour lister les documents et gérer ces dossiers particuliers (documents, image, musique, vidéos et téléchargement) ?

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 696
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 696
    Points : 13 135
    Points
    13 135
    Par défaut
    Pas de soucis sous Seven non plus.

    Ni même sous XP :
    C:\Documents and Settings\All Users\Documents\Ma musique -> Musique partagée

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Parce qu'il n'y a pas d'alias. Chez moi, il n'y a d'ailleurs pas de répertoire My Music, mais Music tout court.
    C:\Users\<Utilisateur>\Music -> Musique
    C:\Users\Public\Music -> Musique publique
    C:\Users -> Utilisateurs
    En fait c'est l'inverse qu'il me faut car getdirectories donne les noms d'alias pas le "vrai" nom
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par retwas Voir le message
    Sinon faire ta propre fonction récursive pour lister les documents et gérer ces dossiers particuliers (documents, image, musique, vidéos et téléchargement) ?
    justement GetDirectories semblait être la bonne fonction récursive recommandée d'où mon problème de gestion de ces dossiers particuliers !
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 696
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 696
    Points : 13 135
    Points
    13 135
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    En fait c'est l'inverse qu'il me faut car getdirectories donne les noms d'alias pas le "vrai" nom
    Manifestement pas !
    Ce serait d'ailleurs surprenant puisque derrière, ça reste des FindFirstFile/FindNextFile (API) et non des fonctions du Shell (ou alors c'est différent sous FMX).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.FormCreate(Sender: TObject);
    var
      Folders :TStringDynArray;
      i       :integer;
    begin
      Folders := TDirectory.GetDirectories('c:\users\public');
     
      for i := 0 to High(Folders) do
        Memo1.Lines.Add(Folders[i] +' -> ' +GetFolderAlias(Folders[i]));
    end;
    c:\users\public\AccountPictures -> Avatars de comptes publiques
    c:\users\public\Desktop -> Desktop
    c:\users\public\Documents -> Documents publics
    c:\users\public\Downloads -> Téléchargements publics
    c:\users\public\Favorites -> Favorites
    c:\users\public\Libraries -> Bibliothèques
    c:\users\public\Music -> Musique publique
    c:\users\public\Pictures -> Images publiques
    c:\users\public\Recorded TV -> Recorded TV
    c:\users\public\Roaming -> Roaming
    c:\users\public\Videos -> Vidéos publiques

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    je ne suis qu'à temps très partiel sur ce truc qui m'agace

    @AndNotOR
    Le fait que tu aies écrit "(ou alors c'est différent sous FMX)" m'a interpellé aussi ai-je sans vergogne tenté ton code en VCL
    OK, avec C:\users\public j'arrive au même résultat mais avec C:\users\public\documents

    C:\Users\Public\documents\Embarcadero
    C:\Users\Public\documents\GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}
    C:\Users\Public\documents\InterBase
    C:\Users\Public\documents\Ma musique
    C:\Users\Public\documents\Mes images
    C:\Users\Public\documents\Mes vidéos
    C:\Users\Public\documents\My Music
    C:\Users\Public\documents\My Pictures
    C:\Users\Public\documents\My Videos

    C:\Users\Public\documents\RAD Studio
    C:\Users\Public\documents\RBuilder
    C:\Users\Public\documents\Sauvegardes
    C:\Users\Public\documents\Smart Label Printer
    C:\Users\Public\documents\sun
    C:\Users\Public\documents\tmssoftware
    C:\Users\Public\documents\Wondershare
    les lignes en rouge sont le problème

    retwas avec son attribut reparsepoint me semble donner une piste prometteuse, si je rajoute un TFilterPredicate

    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
      function Predicat(const Path: string;const SearchRec: TSearchRec): Boolean;
      begin
        if (SearchRec.Attr AND faSymLink)<>0 then result:=false else result:=true;
      end;
     
     
    procedure TForm12.FormCreate(Sender: TObject);
     var
      Folders :TStringDynArray;
      i       :integer;
     
     
    begin
      Folders := TDirectory.GetDirectories('C:\Users\Public\documents',Predicat);
      for i := 0 to High(Folders) do Memo1.Lines.Add(Folders[i]);
    end;
    je supprime bien ces lignes rouges

    Citation Envoyé par retwas
    Il y a peut être moyen de convertir un lien symbolique en lien normal ?
    C'est bien la Question. Bon, avec le TFilterPredicate je peux savoir que c'est un lien symbolique et obtenir un handle de fichier par SearchRec.FindHandle reste a trouver la fonction qui permet d'obtenir le nom du fichier à partir du handle (je remet pas la main dessus mais je l'ai vu) et le moyen d'implémenter ça !

    Sur ce je m'arrête pour vaquer à mon travail urgent
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Sur ce je m'arrête pour vaquer à mon travail urgent
    Finalement pas si urgent et réglé plus rapidement que prévu !

    Bon, avec le TFilterPredicate je peux savoir que c'est un lien symbolique et a trouver la fonction qui permet d'obtenir le nom du fichier (je remet pas la main dessus mais je l'ai vu) et le moyen d'implémenter ça !
    En fait de fonction j'ai trouvé TFile.GetSymLinkTarget qui semblait correspondre à mes besoins mais hélas me renvoie une erreur de drive non trouvé je ne comprend pas trop pourquoi !
    en fouillant un peu à gauche à droite j'ai trouvé un code

    je vous livre en vrac (il y a du ménage à faire!) ma solution qui fonctionne

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     function Predicat(const Path: string;const SearchRec: TSearchRec): Boolean;
      var S : String;
          f : boolean;
     
     function MyFileGetSymLinkTarget( const APathToLink : string; var ATarget : string ) : boolean;
     var
      LinkHandle: THandle;
      TargetName: array [0..512] of Char;
     begin
        ATarget := '';
        LinkHandle := CreateFile( PChar(APathToLink), 0, FILE_SHARE_READ, nil,
            OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
        Win32Check(LinkHandle <> INVALID_HANDLE_VALUE);
        try
          Result := GetFinalPathNameByHandle(LinkHandle, TargetName, OFS_MAXPATHNAME, FILE_NAME_NORMALIZED) > 0;
          if Result then
            begin
            ATarget := TargetName;
            if Pos( '\\?\UNC\', ATarget ) = 1 then
               begin
               Delete( ATarget, 1, 8 );
               Insert( '\\', ATarget, 1 );
               end
              else
              if Pos( '\\?\', ATarget ) = 1 then
                 Delete( ATarget, 1, 4 );
            end;
        finally
          CloseHandle(LinkHandle);
        end;
      end;
     
      begin
        if (SearchRec.Attr AND faSymLink)<>0 then
         begin
          result:=false;
           Try
           f:=MyFileGetSymLinkTarget(TPath.Combine(Path,SearchRec.Name),S);
           Form12.Memo1.Lines.Add(S);
          except
           on E:Exception do Showmessage(E.Message);
          End;
         end
         else result:=true;
       // SearchRec.FindHandle
     
      end;
     
     
    procedure TForm12.FormCreate(Sender: TObject);
     var
      Folders :TStringDynArray;
      i       :integer;
     
     
    begin
      Folders := TDirectory.GetDirectories('C:\Users\Public\documents',Predicat);
      for i := 0 to High(Folders) do Memo1.Lines.Add(Folders[i]);
    end;
    C:\Users\Public\Music
    C:\Users\Public\Pictures
    C:\Users\Public\Videos
    C:\Users\Public\Music
    C:\Users\Public\Pictures
    C:\Users\Public\Videos

    C:\Users\Public\documents\Embarcadero
    C:\Users\Public\documents\GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}
    C:\Users\Public\documents\InterBase
    C:\Users\Public\documents\RAD Studio
    C:\Users\Public\documents\RBuilder
    C:\Users\Public\documents\Sauvegardes
    C:\Users\Public\documents\Smart Label Printer
    C:\Users\Public\documents\sun
    C:\Users\Public\documents\tmssoftware
    C:\Users\Public\documents\Wondershare
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. Requète de non correspondance multiple qui me pose soucis :s
    Par nekro dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 21/06/2008, 15h19
  2. [FTP] Ouverture d'image en pop up qui pose soucis..
    Par Renaud59 dans le forum Langage
    Réponses: 7
    Dernier message: 27/07/2007, 14h40
  3. [VB.Net/Access] Pourquoi une connection multiple pose souci ?
    Par cbleas dans le forum Accès aux données
    Réponses: 2
    Dernier message: 10/08/2006, 16h57
  4. Migration client Oracle et source PB pose soucis
    Par Doctor Z dans le forum Powerbuilder
    Réponses: 1
    Dernier message: 28/07/2006, 09h07

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