Avatar billede cogitans Nybegynder
15. januar 2005 - 14:31 Der er 18 kommentarer og
1 løsning

Bibliotekker og filer

Denne lille stump kode virker ikke helt som det skal. Det er meningen, at der skal vises en liste af bibliotekkerne på hardisken. Der skal samtidig vises de tilhørende filer i de aktuelle bibliotekker. Men når koden køres, så lykkedes det kun i det sidste bibliotek i listen.
Hvorfor sker dette?

      public void PopulateTreeView(string directoryValue, TreeNode parentNode )
      {
        string[] directoryArray = Directory.GetDirectories(directoryValue);
        string[] fileArray = Directory.GetFiles(directoryValue);

        try
        {
            if ( directoryArray.Length != 0 )
            {
              foreach ( string directory in directoryArray )
              {
                  TreeNode myNode = new TreeNode( directory );
                  parentNode.Nodes.Add( myNode );
                  foreach( string file in fileArray)
                  {
                      TreeNode myNodeFile = new TreeNode( file );
                      parentNode.Nodes.Add( myNodeFile );
                  }
                  PopulateTreeView( directory, myNode );
              }
            }
        }
        catch ( UnauthorizedAccessException )
        { 
            parentNode.Nodes.Add( "Access denied" );
        }
                                       
      }
Avatar billede arne_v Ekspert
15. januar 2005 - 19:22 #1
Jeg har ikke sport forstand på TreeView & TreeNode, men jeg forstår ikke
hvorfor file løkken er inde i directory løkken !
Avatar billede lifo Nybegynder
15. januar 2005 - 19:26 #2
om du ikke har en anden referance til den oprindelige parentNode så er det kun den sidste gennemløb parent node du refererer til
og det er den sidste mappe
Avatar billede cogitans Nybegynder
15. januar 2005 - 20:20 #3
Jeg går ud fra, at da der kan være flere filer inde i 1 bibliotek, så skal der vel være en filløkke inde i det enkelte bibliotek - altså inde i biblioteksløkken(?).

Har jeg ikke en reference til den oprindelige, når det jo kalder sig selv hele tiden? (er det ikke det, der hedder rekursivt)
Avatar billede arne_v Ekspert
15. januar 2005 - 20:23 #4
Der kan være flere filer i et dir. Derfor skal du også have en file løkke.

Men den skal næppe være inden i directory løkken.

Husk at de filer du processer er filerne i parent fir.
Avatar billede cogitans Nybegynder
15. januar 2005 - 20:43 #5
Giver Directory.GetDirectories ikke et array med de bibliotekker, der er inde i det aktuelle bibliotek - altså der hvor man er på nuværende tidspunkt?
Avatar billede arne_v Ekspert
15. januar 2005 - 20:49 #6
Jo ...
Avatar billede arne_v Ekspert
15. januar 2005 - 20:57 #7
Men lad os sige at det aktuelle bibliotek indeholder 3 dirs og 4 filer.

directoryArray vil så indeholde 3 strings og fileArray vil indeholde 4 strings

men du vil kalde parentNode.Nodes.Add 12 gange
Avatar billede cogitans Nybegynder
15. januar 2005 - 22:40 #8
Hmm, tja, der kan du da have en pointe. Når jeg sætter filløkken uden for biblioteksløkken, så giver det også et bedre resultat. Men det er dog stadig ikke tilfredsstillende. Har du en idé om, hvad der mere er forkert?
Avatar billede arne_v Ekspert
15. januar 2005 - 22:43 #9
Det kender jeg nok for lidt til TreeView & TreeNode til at kunne sige
Avatar billede lifo Nybegynder
15. januar 2005 - 22:56 #10
denne skulle fungere

private TreeNode scannDir(string dir)
{
  TreeNode p =null;
  try
    {
    DirectoryInfo di = new DirectoryInfo(dir);
    p=new TreeNode(di.Name);
    DirectoryInfo[] dirs = di.GetDirectories();
    FileInfo[] fi = di.GetFiles();
       
    if(fi!=null)
    {
      foreach(FileInfo f in fi)
      {
        p.Nodes.Add(f.Name);
      }
    }
    if(dirs!=null)
    {
      foreach(DirectoryInfo d in dirs)
      {
        p.Nodes.Add(scannDir(d.FullName));
      }
    }               
      }
   
catch(Exception ex)
{
  MessageBox.Show("Exception i scannDir()"+ex);
}
return p;
}
Avatar billede cogitans Nybegynder
16. januar 2005 - 11:23 #11
Tak for koden. Men den virker dog ikke. Resten af min kode ser således ud:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;

namespace UsingTreeView
{
  public class TreeViewDirectoryStructureTest : System.Windows.Forms.Form
  {
      private System.Windows.Forms.TreeView directoryTreeView;
      private System.ComponentModel.Container components = null;

      public TreeViewDirectoryStructureTest()
      {
        InitializeComponent();
      }

      protected override void Dispose( bool disposing )
      {
        if( disposing )
        {
            if (components != null)
            {
              components.Dispose();
            }
        }
        base.Dispose( disposing );
      }
   
      private void InitializeComponent()
      {
        this.directoryTreeView = new System.Windows.Forms.TreeView();
        this.SuspendLayout();

        this.directoryTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
        this.directoryTreeView.ImageIndex = -1;
        this.directoryTreeView.Name = "directoryTreeView";
        this.directoryTreeView.SelectedImageIndex = -1;
        this.directoryTreeView.Size = new System.Drawing.Size(292, 273);
        this.directoryTreeView.TabIndex = 1;

        this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
        this.ClientSize = new System.Drawing.Size(292, 273);
        this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                      this.directoryTreeView});
        this.Name = "TreeViewDirectoryStructureTest";
        this.Text = "TreeViewDirectoryStructureTest";
        this.Load += new System.EventHandler(this.TreeViewDirectoryStructureTest_Load);
        this.ResumeLayout(false);

      }
        #endregion

      [STAThread]
      static void Main()
      {
        Application.Run(new TreeViewDirectoryStructureTest());
      }

      /*oprindeliget forsøg
      public void PopulateTreeView(string directoryValue, TreeNode parentNode )
      {
        string[] directoryArray = Directory.GetDirectories(directoryValue);
        string[] fileArray = Directory.GetFiles(directoryValue);

        try
        {
            if ( directoryArray.Length != 0 )
            {
              foreach ( string directory in directoryArray )
              {
                  TreeNode myNode = new TreeNode( directory );
                  parentNode.Nodes.Add( myNode );
                  PopulateTreeView( directory, myNode );
              }
                foreach( string file in fileArray)
                {
                    TreeNode myNodeFile = new TreeNode( file );
                    parentNode.Nodes.Add( myNodeFile );
                }
            }
        }
        catch ( UnauthorizedAccessException )
        { 
            parentNode.Nodes.Add( "Access denied" );
        }
                                       
      }
*/

      private TreeNode PopulateTreeView(string dir)
      {
          TreeNode p =null;
          try
          {
              DirectoryInfo di = new DirectoryInfo(dir);
              p=new TreeNode(di.Name);
              DirectoryInfo[] dirs = di.GetDirectories();
              FileInfo[] fi = di.GetFiles();
       
              if(fi!=null)
              {
                  foreach(FileInfo f in fi)
                  {
                      p.Nodes.Add(f.Name);
                  }
              }
              if(dirs!=null)
              {
                  foreach(DirectoryInfo d in dirs)
                  {
                      p.Nodes.Add(PopulateTreeView(d.FullName));
                  }
              }               
          }
   
          catch(Exception ex)
          {
              MessageBox.Show("Exception i scannDir()"+ex);
          }
          return p;
      }

      private void TreeViewDirectoryStructureTest_Load(object sender, System.EventArgs e)
      {
        directoryTreeView.Nodes.Add("e:\");
        //PopulateTreeView("e:\\", directoryTreeView.Nodes[ 0 ]);
          PopulateTreeView("e:\\");
      }
  }
}

Så hvad gør jeg nu?
Avatar billede lifo Nybegynder
16. januar 2005 - 18:03 #12
den kode som jeg skrev fungerer jeg har selv testet den
du kalder den bare forkert

directoryTreeView.Nodes.Add(PopulateTreeView(@"e:\"))

fungerer det ikke ?
Avatar billede cogitans Nybegynder
16. januar 2005 - 18:20 #13
Jo, nu virker det. Hvad var den afgørende forskel på mit forsøg og din løsningen?
Avatar billede lifo Nybegynder
16. januar 2005 - 19:37 #14
svært at forklare
men
det er en rekursiv metode og så det vil sige at hvad parent node peget på ændres hele tiden for hvert kald til PopulateTreeView
der er nogle fejl blant andet at du mangler at have en reference til den første parent node

ahhh f**k jeg kan ikke forklare det
pisse svært at forklare rekursive metoder

men den største forskel er denne linje

p.Nodes.Add(PopulateTreeView(d.FullName));
Avatar billede lifo Nybegynder
16. januar 2005 - 19:43 #15
om det er brug af metoden du er i tvivl om så forklarer dette måske bedre

// PopulateTreeView returnerer en TreeNode
TreeNode DrevE = PopulateTreeView(@"e:\"));

// som så skal sættes ind i dit TreeView
directoryTreeView.Nodes.Add(DrevE);
Avatar billede cogitans Nybegynder
16. januar 2005 - 20:40 #16
Ja, jeg er godt med på koden i 19:43:11.
Jeg ved godt, hvad "rekursivt" vil sige. Jeg mangler bare, at se lyset (altså forskellen på de 2 løsninger, og hvor det smarte netop er.)...
Avatar billede lifo Nybegynder
17. januar 2005 - 01:52 #17
kan desværre ikke forklare det her

havede du siddet vedsiden af så kunne jeg forklare det mens jeg tegnede det på papir
Avatar billede cogitans Nybegynder
17. januar 2005 - 09:28 #18
Jeg tilføjer et link til en node i et træ:
directoryTreeView.Nodes.Add(PopulateTreeView(@"\\computernavn\temp\"));
Dette link skal klienten så kunne klikke på, og derigennem få adgang til filen.
?
Avatar billede cogitans Nybegynder
17. januar 2005 - 12:44 #19
Nå, det var da en skam. Jeg gik nemlig ud fra, at man også kunne få en forklaring på løsningen herinde...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester