Autor Beitrag
ramses10
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 07.02.12 14:17 
hallo!
habe mir aus der MSDN ein Beispiel mit TreeView und ListView als Anwendung erzeugt. Funktioniert soweit sehr gut, nur einen anderen Pfad nimmt er nicht an. Es kommt eine UnauthorizedAccessException
beim Codeteil:
(@"..\..") kommt - wenn ich bspw. C:\ für ../.. verwende - die Fehlermeldung: Der Zugriff auf den Pfad "C:\System Volume Information\" wurde verweigert.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
TreeNode rootNode;

DirectoryInfo info = new DirectoryInfo(@"..\..");
if (info.Exists)
{
    rootNode = new TreeNode(info.Name);
    rootNode.Tag = info;
    GetDirectories(info.GetDirectories(), rootNode);
    treeView1.Nodes.Add(rootNode);
}

kann mir bitte jemand weiter helfen?,
danke o.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Di 07.02.12 15:27 
Hallo ramses10

Diese Ausnahme wird bei einem Zugriff z.B. auf einen Ordner mit bestimmten Berechtigungen ausgegeben. Somit hat dein Ordner einen Schreibschutz oder Du hast keine Leseberechtigung etc. (ist beim Ordner "System Volume Information" normalerweise immer so) mit deinem Anmeldenamen und willst darauf zugreifen.

Ansonsten funktioniert dein Code:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
TreeNode rootNode;
            DirectoryInfo info = new DirectoryInfo(@"C:\"); 

            if (info.Exists) 
            { 
                rootNode = new TreeNode(info.Name);
                rootNode.Text = info.GetDirectories().Length.ToString();
                treeView1.Nodes.Add(rootNode); 
            }

_________________
Gruss
mats74
ramses10 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 07.02.12 16:07 
hallo mats74!
danke für deine rasche Antwort, habe deinen Code getauscht. Nur leider funkt. er nicht. TreeView zeigt nicht das Laufwerk, sondern die Zahl 23 an und dann kommt wieder ein NullReferenceEx. Fehler, bitte um weitere Hilfe oder soll ich den gesamten Code posten?
mfg o.
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Di 07.02.12 16:28 
... die Zahl 23 ist die Anzahl deiner Unterordner im Laufwerk C:\.
Die Ordnerstruktur wird also korrekt durchlaufen (inkl. System Volume Information).

Mit ein Bisschen mehr Code wäre uns natürlich geholfen ... :wink:

_________________
Gruss
mats74
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 07.02.12 16:50 
Hallo ramses10,

fange innerhalb deiner GetDirectories-Methode die Fehler mittels try...catch ab.
Ein Code-Snippet dafür gibt es z.B. unter Verzeichnisse und Dateien rekursiv durchlaufen
ramses10 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 07.02.12 17:26 
danke th69 und mats74.
mein Code:

ausblenden volle Höhe C#-Quelltext
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:
using System.IO;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


namespace TreeView_nach_MSDN
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            PopulateTreeView();
        }
        private void PopulateTreeView()
        {
            TreeNode rootNode;

            DirectoryInfo info = new DirectoryInfo(@"C:\");   //die Angabe (@"./.."); funktioniert, aber nur für den Ordner in dem das Projekt gespeichert wurde
            if (info.Exists)
            {
                //rootNode = new TreeNode(info.Name);
                //rootNode.Tag = info;
                //GetDirectories(info.GetDirectories(), rootNode);
                //treeView1.Nodes.Add(rootNode);
                rootNode = new TreeNode(info.Name);
                rootNode.Text = info.GetDirectories().Length.ToString();
                treeView1.Nodes.Add(rootNode); 
            }
        }

        private void GetDirectories(DirectoryInfo[] subDirs,
            TreeNode nodeToAddTo)
        {
            TreeNode aNode;
            DirectoryInfo[] subSubDirs;
            foreach (DirectoryInfo subDir in subDirs)
            {
                aNode = new TreeNode(subDir.Name, 00);
                aNode.Tag = subDir;
                aNode.ImageKey = "folder";
                subSubDirs = subDir.GetDirectories();
                if (subSubDirs.Length != 0)
                {
                    GetDirectories(subSubDirs, aNode);
                }
                nodeToAddTo.Nodes.Add(aNode);
            }
        }
        void treeView1_NodeMouseClick(object sender,
            TreeNodeMouseClickEventArgs e)
        {
            this.treeView1.NodeMouseClick += new TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseClick);

            TreeNode newSelected = e.Node;
            listView1.Items.Clear();
            DirectoryInfo nodeDirInfo = (DirectoryInfo)newSelected.Tag;
            ListViewItem.ListViewSubItem[] subItems;
            ListViewItem item = null;

            foreach (DirectoryInfo dir in nodeDirInfo.GetDirectories())
            {
                item = new ListViewItem(dir.Name, 0);
                subItems = new ListViewItem.ListViewSubItem[]
                    {new ListViewItem.ListViewSubItem(item, "Directory"), 
                     new ListViewItem.ListViewSubItem(item, 
            dir.LastAccessTime.ToShortDateString())};
                item.SubItems.AddRange(subItems);
                listView1.Items.Add(item);
            }
            foreach (FileInfo file in nodeDirInfo.GetFiles())
            {
                item = new ListViewItem(file.Name, 1);
                subItems = new ListViewItem.ListViewSubItem[]
                    { new ListViewItem.ListViewSubItem(item, "File"), 
                     new ListViewItem.ListViewSubItem(item, 
            file.LastAccessTime.ToShortDateString())};

                item.SubItems.AddRange(subItems);
                listView1.Items.Add(item);
            }

            listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
        }
    }
}


Moderiert von user profile iconKha: C#-Tags hinzugefügt
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Di 07.02.12 17:54 
Was ist eigentlich das Ziel deiner Aufgabe? Was soll wo verarbeitet werden?
Dein grundsätzliches Problem hab ich bis jetzt wahrscheinlich noch nicht wirklich begriffen :gruebel: .

Der Link, der Dir Th69 gegeben hat, beinhaltet eigentlich alles, was es für Directory-Verarbeitungen so alles braucht und muss nur auf deine Ansprüche abgeleitet werden.

_________________
Gruss
mats74
ramses10 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 07.02.12 18:26 
also das Ziel ist, alle Ordner auf C:\ in der ListView anzuzeigen. Beim Code ("@../."); funktioniert dies. Hingegen bei der Angabe von C:\ nicht!
danke für deine Mühe
o.
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Di 07.02.12 18:54 
... ich habe die erste Funktion aus dem Link von Th69 mal auf dein Ziel angepasst.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
TraverseFileSystem(@"C:\Temp\");
public void TraverseFileSystem (String strDir)
        {
            try
            {
                TreeNode rootNode;
                
                foreach (String strSubDir in Directory.GetDirectories (strDir))
                {
                    rootNode = new TreeNode();
                    rootNode.Text = strSubDir;
                    treeView1.Nodes.Add(rootNode);
                }
            }
            catch (Exception)
            {
                Console.WriteLine ("error: " + strDir);
            }
        }

Dieser Code liestet Dir alle Unterverzeichnisse in einem TreeView auf (sollte auch mit einer ListView klappen), was ja eigentlich deiner Vorgabe entspricht.

_________________
Gruss
mats74
ramses10 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 08.02.12 08:41 
danke, nur egal was ich mache, der code mit TraverseFile.. wird nicht erkannt. Konnte auch in der MSDN keine Hilfe finden. Es muss doch eine andere Möglichkeit geben
mfg o.
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Mi 08.02.12 09:09 
user profile iconramses10 hat folgendes geschrieben Zum zitierten Posting springen:
danke, nur egal was ich mache, der code mit TraverseFile.. wird nicht erkannt.

Ich weiss eigentlich nicht, was an diesem Code nicht erkannt werden kann. :gruebel:

Vielleicht kickst Du die Methode einfach mal in einem Event an?!
ausblenden C#-Quelltext
1:
2:
3:
4:
private void button1_Click(object sender, EventArgs e)
        {
            TraverseFileSystem(@"C:\Temp\"); // Pfadangabe nach deiner Wahl
        }

_________________
Gruss
mats74
ramses10 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 08.02.12 17:05 
bitte sei mir nicht böse, aber wo gehört der code eingefügt.. Es funkt. nämlich nirgends! Oder fehlt eine using?
danke, über so viel Geduld
o.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 08.02.12 17:30 
Hallo ramses10,

was genau funktioniert denn nicht? Ich hoffe mal, daß du an dem Code von mats74 verstanden hast, daß die erste Zeile nur der Aufruf ist.
Außerdem zeigt der Code von ihm nur direkte Unterordner an (und nicht rekursiv).

Um es kurz zu machen, ändere deinen Code (dein 3. Posting hier im Thema) folgendermaßen ab (innerhalb der GetDirectories-Methode):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
try
{
  subSubDirs = subDir.GetDirectories();
  if (subSubDirs.Length != 0)
  {
      GetDirectories(subSubDirs, aNode);
  }
  nodeToAddTo.Nodes.Add(aNode);
}
catch
{
  // ignore all exceptions e.g. file access exception 
}

(wenn du das Verzeichnis trotzdem als Knoten anzeigen lassen willst, dann packe die Nodes.Add-Zeile nach dem catch-Block)

Und demnächst erwarten wir ein bißchen mehr Eigeninitiative (denn nur durch Fehler und Fehlererkennung wird man das Programmieren lernen).
ramses10 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 08.02.12 17:54 
danke