di1 ist die lauf variable die einen Wert zugewiesen bekommt der in der Liste nicht existiert.
Das kann nicht möglich sein. Mit der foreach gehst du die Liste durch, in deinem Moment das Array. Jedes Element das die foreach als aktuelles Element ausgibt, ist in der Liste vorhanden.
leider sagt Dein Bild nicht wirklich viel aus, solange Du nicht dazuschreibst, an welcher Stelle Du genau mit dem Debugger stehst und wieviele Durchläufe u schon durch hast.
Denn innerhalb der foreach biegst Du ja dirs um mittels
cd = di1;
dirs = cd.GetDirectories();
Danach ist entspricht dirs nicht mehr der Collection, die im Schleifenkopf durchlaufen wird.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Du fummelst in der foreach Schleife an dem Array rum das du durchläufst
Eigentlich nicht. Nur wird dirs eben komplett neu zugewiesen, und während im Schleifenkopf die alte Collection durchlaufen wird, auf die dirs anfänglich verwiesen hat, wird eben im Debugger die neu gesetzte dirs-Collection angezeigt.
Funktionieren kann das schon, aber die Anzeige im Debugger kann dann eben etwas verwirrend sein.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
stimmt natürlich, aber an den (Lauf-)Variablen einer Schleife "herumzupfriemeln" halte ich für schlechten Stil. Meistens kommt eben nicht das heraus was eigentlich gemeint war.
Der Link den ich gepostet habe löst das Problem elegant per rekursivem Funktionsaufruf, wahrscheinlich hatte Threadersteller ähnliches im Sinn, so wie ich den Code verstanden habe oder besser was ich vermute was das Ziel des Codes sein soll...
Nur wird dirs eben komplett neu zugewiesen, und während im Schleifenkopf die alte Collection durchlaufen wird, auf die dirs anfänglich verwiesen hat, wird eben im Debugger die neu gesetzte dirs-Collection angezeigt.
Dies war mein Problem.
Ich habe jetzt einfach eine for Schlaufe verwendet anstatt eine foreach Schlaufe.
So funktioniert es:
foreach (DriveInfo drive in DriveInfo.GetDrives())
{
Hashtable fort = new Hashtable();
DirectoryInfo diri = drive.RootDirectory;
int tabCount = 1;
Console.WriteLine(diri.Name);
while (true)
{
if (!fort.Contains(diri.FullName)) fort.Add(diri.FullName, diri.GetDirectories());
for (int i = 0; i < ((DirectoryInfo[])fort[diri.FullName]).Length; i++)
{
Console.WriteLine(getTabs(tabCount) + ((DirectoryInfo[])fort[diri.FullName])[i].Name + "\\");
if (((DirectoryInfo[])fort[diri.FullName]).Length == 0) break;
DirectoryInfo mayNextDirI = ((DirectoryInfo[])fort[diri.FullName])[i];
DirectoryInfo[] tmp = new DirectoryInfo[((DirectoryInfo[])fort[diri.FullName]).Length - 1];
for (int c = 0; c < tmp.Length; c++)
{
tmp[c] = ((DirectoryInfo[])fort[diri.FullName])[c + 1];
}
fort[diri.FullName] = tmp;
if (mayNextDirI != null)
{
try
{
diri = mayNextDirI;
fort.Add(diri.FullName, diri.GetDirectories());
tabCount++;
}
catch (UnauthorizedAccessException e)
{
diri = diri.Parent;
Console.WriteLine(getTabs(tabCount + 1) + e.Message);
}
}
i = -1;
}
for (int i = 0; i < diri.GetFiles().Length; i++)
{
Console.WriteLine(getTabs(tabCount) + diri.GetFiles()[i].Name);
}
if (diri.Parent == null) break;
diri = diri.Parent;
tabCount--;
}
}
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Fridoo am .