Autor |
Beitrag |
ramses10
Hält's aus hier
Beiträge: 11
|
Verfasst: 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.
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 Th69: C#-Tags hinzugefügt
|
|
mats74
      
Beiträge: 189
Erhaltene Danke: 26
Win 10
VS 2017/19, C++, C#
|
Verfasst: 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:
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 
Hält's aus hier
Beiträge: 11
|
Verfasst: 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
      
Beiträge: 189
Erhaltene Danke: 26
Win 10
VS 2017/19, C++, C#
|
Verfasst: 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 ... 
_________________ Gruss
mats74
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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 
Hält's aus hier
Beiträge: 11
|
Verfasst: Di 07.02.12 17:26
danke th69 und mats74.
mein Code:
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:\"); if (info.Exists) { 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, 0, 0); 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 Kha: C#-Tags hinzugefügt
|
|
mats74
      
Beiträge: 189
Erhaltene Danke: 26
Win 10
VS 2017/19, C++, C#
|
Verfasst: 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  .
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 
Hält's aus hier
Beiträge: 11
|
Verfasst: 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
      
Beiträge: 189
Erhaltene Danke: 26
Win 10
VS 2017/19, C++, C#
|
Verfasst: Di 07.02.12 18:54
... ich habe die erste Funktion aus dem Link von Th69 mal auf dein Ziel angepasst.
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 
Hält's aus hier
Beiträge: 11
|
Verfasst: 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
      
Beiträge: 189
Erhaltene Danke: 26
Win 10
VS 2017/19, C++, C#
|
Verfasst: Mi 08.02.12 09:09
_________________ Gruss
mats74
|
|
ramses10 
Hält's aus hier
Beiträge: 11
|
Verfasst: 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
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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):
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 { } |
(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 
Hält's aus hier
Beiträge: 11
|
Verfasst: Mi 08.02.12 17:54
|
|