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

Delphi Discussion :

Constitution de l'arborescence d'un disque


Sujet :

Delphi

  1. #1
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 925
    Points : 6 040
    Points
    6 040
    Par défaut Constitution de l'arborescence d'un disque
    Hello à tous,

    Le sujet est posé, je procède actuellement avec du récursif, mais avec des HD de plusieurs To, ça devient chronophage ^^

    Je me demandais si Windows n'aurait pas "sous le coude", une liste de tous les répertoires à jour en temps réel (on peut rêver, hein?) , sinon quelles seraient les alternatives ?

    Tout ça pour alimenter un virtualTreeView...

    Merci de votre retour.

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 264
    Points : 41 665
    Points
    41 665
    Billets dans le blog
    64
    Par défaut
    Bonjour,
    Quelle version de Delphi, car cela à pas mal évolué depuis D7 ?
    Quant à Windows je suis plus qu'un peu fâché avec en ce moment peut être en fouillant dans les WMI mais cela risque d'être encore plus chronophage

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 705
    Points : 25 575
    Points
    25 575
    Par défaut
    virtualTreeView ... si c'est pour de l'affichage reporte la lecture au moment de l'ouverture du nœud (c'est ce que je faisais pour la base de registre)
    Pour afficher le (+), il te faudrait surement anticiper la lecture du niveau suivant

    Si tu veux absolument tout affiché d'un coup, pense à BeginUpdate\EndUpdate

    Tu peux aussi threadé la lecture, constituer un arbre en mémoire, le virtualTreeView lui lit l'arbre mémoire (et attend si le thread n'est pas arrivé à ce moment ou alors tu prévois une alimentation du cache ciblée)

    Le code récursif est très banal

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    procedure ScanMiniDump(const ADirectory: TFileName; AExeFileNames: TStrings; AProgressEvent: TScanMiniDumpProgressEvent = nil; ARecursive: Boolean = True);
     
      function SearchBinaryInFile(...
      function SearchLastZero(...
      procedure ScanMiniDumpExtractExeName(...;
     
    var
      Results: TStringList;
      Dir: TFileName;
      Path, Filter: string;
      sr: TSearchRec;
    begin
      if AExeFileNames is TStringList then
        Results := TStringList(AExeFileNames)
      else
        Results := TStringList.Create();
      try
        Results.Duplicates := dupIgnore;
        Results.Sorted := True;
     
        Path := IncludeTrailingPathDelimiter(ADirectory);
        Filter := Path + '*.dmp';
     
        try
          if Assigned(AProgressEvent) then
            AProgressEvent(Path);
     
          // Les Fichiers !
          if FindFirst(Filter, faNormal, sr) = 0 then
          begin
            try
              repeat
                try
                  ScanMiniDumpExtractExeName(Path + sr.Name, Results);
                except
                  on E: Exception do
                    Results.Add(E.Message);
                end;
                if Assigned(AProgressEvent) then
                  AProgressEvent(Path + sr.Name);
                DeleteFile(Path + sr.Name);
              until FindNext(sr) <> 0;
            finally
              FindClose(sr);
            end;
          end;
     
          // Les Dossiers !
          if ARecursive then
          begin
            Filter := Path + '*';
            if FindFirst(Filter, faDirectory, sr) = 0 then
            begin
              try
                repeat
                  if ((sr.Attr and faDirectory) = faDirectory) and (sr.Name <> '.') and (sr.Name <> '..') then
                  begin
                    Dir := Path + sr.Name;
                    ScanMiniDump(Dir, Results, AProgressEvent, True);
                  end;
     
                until FindNext(sr) <> 0;
              finally
                FindClose(sr);
              end;
            end;
          end;
     
        finally
          if AExeFileNames <> Results then
            AExeFileNames.Assign(Results);
        end;
      finally
        if AExeFileNames <> Results then
          Results.Free();
      end;
    end;

  4. #4
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 614
    Points
    3 614
    Par défaut
    Tout dépend de l'utilisation, mais un chargement global en une fois n'est effectivement pas toujours judicieux. A ma connaissance pas de solution miracle côté API de Windows mais de la simplification côté Delphi avec l'unité System.IOUtils et sa classe TDirectory.

    A utiliser pour récupérer les infos d'un répertoire (arborescence et fichiers) les méthodes de classe TDirectory.Files et TDirectory.Directories. Elles ressortent des listes, on peut ensuite en faire ce qu'on veut avec System.IOUtils.TDirectory ou System.IOUtils.TFile

    Plus de détails du côté du docwiki :
    http://docwiki.embarcadero.com/Libra...ectory_Methods

    Bon, bien entendu l'unité System.IOUtils est récente à l'échelle de l'univers, mais doit dater d'une version XE. Gros avantage le code correspondant est multiplateforme.

  5. #5
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 925
    Points : 6 040
    Points
    6 040
    Par défaut
    Hello,

    Merci pour vos différentes pistes que je vais explorer.

    @serge: j'ai perdu qq réflexes^^ c'est pour Berlin.

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 264
    Points : 41 665
    Points
    41 665
    Billets dans le blog
    64
    Par défaut
    Y a pas de quoi être désolé c'est juste que la donne change avec System.IOUtils et ses fonctions, et tout ce qui a été amélioré sur les threads anonymes ou non.
    La semaine 7 du bootcamp 2018 répondra à tes questions je pense (Embarcadero Academy)
    En tout cas cette présentation de Olaf Monien, hyper pédagogique, est à regarder (justement le fil est une recherche de fichiers !)
    je ne me souviens plus par contre de où sont positionnés les sources

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Arborescence d'un disque en XML
    Par migutz dans le forum VB.NET
    Réponses: 3
    Dernier message: 08/11/2007, 16h36
  2. Arborescence d'un disque
    Par Tunka dans le forum Windows
    Réponses: 1
    Dernier message: 12/10/2006, 14h28
  3. Acces à l'arborescence d'un disque à partir d'une page jsp
    Par fabricew59 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 29/09/2006, 17h53
  4. Copier arborescence d'un disque dur
    Par soad029 dans le forum Administration système
    Réponses: 2
    Dernier message: 15/05/2006, 16h02

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