Moin,
ich versuche aktuell, Ordner und Dateien rekursiv von einem FTP-Server aufzulisten. Dazu benutze ich die Biko Library.
Die zurückgegebenen Items sind jeweils vom Typ
Ich habe mir dann eine Klasse
Beim Aufruf der Methode, die die Dateien und Verzeichnisse auflistet, bekommt man eine
Dies ist meine Methode, die dann die Subitems initialisieren soll:
Das ist der Aufruf:
Das macht folgendes, es listet die Dateien und Ordner auf, listet dann diejenigen auf, deren
Mit genau diesem wird dann die Methode aufgerufen, die rekursiv alle SubItems auflisten soll.
So, soweit geht es eigentlich, nur fügt der Code ab dem Zeitpunkt, wo die PathLength 2 ist, keine SubItems mehr hinzu, diese Property ist dann
Die Ordner im Root haben SubItems, aber halt genau diese haben jeweils keine SubItems mehr. Ich weiß nicht warum. Eigentlich müsste "InitializeSubItems" das doch rekursiv laden, denn ich gebe ja immer die aktuelle
Ich habe dann mit Haltepunkten debuggt und festgestellt, dass die Linq-Queries alles richtig machen, beim Debuggen werden auch rekursiv alle SubItems richtig hinzugefügt, nur beim Zuweisen am Ende gibt es anscheinend ein Problem. Theoretisch müsste das aber doch eigentlich immer die selbe Instanz sein, oder?
Ich gehe stark davon aus, dass das Problem hier liegt, denn beim Debuggen geht es, nur am Ende will er nicht richtig.
So sollte es z. B. aussehen:
Am Ende kommt aber nur das raus:
Das ist bei jedem Item in
Es muss also am Zuweisen liegen, denn beim Debuggen wurden bei jedem Aufruf der Methode immer die richtigen SubItems rekursiv hinzugefügt, wie gesagt, die Instanz sollte aber stimmen.
Sieht jemand den Fehler? Ich bin mit meinem Latein am Ende, da ich das Ganze intensiv planen und in Code umsetzen musste, weil das hier eben schwieriger ist.
Grüße
ich versuche aktuell, Ordner und Dateien rekursiv von einem FTP-Server aufzulisten. Dazu benutze ich die Biko Library.
Die zurückgegebenen Items sind jeweils vom Typ
FtpItem
, diese haben allerdings keine SubItems
-Property, sondern nur einen ParentPath
, den ich halt dazu benutzen kann.Ich habe mir dann eine Klasse
ListingItem
erstellt, um dort dann die Items und SubItems rekursiv zu speichern:C#-Quellcode
- using System.Collections.Generic;
- namespace nUpdate.Administration.Core
- {
- public class ListingItem
- {
- public ListingItem(string text)
- {
- Text = text;
- }
- /// <summary>
- /// Gets or sets the text of the current item.
- /// </summary>
- public string Text { get; set; }
- /// <summary>
- /// Represents the sub items of the current item.
- /// </summary>
- public IEnumerable<ListingItem> SubItems { get; set; }
- }
- }
Beim Aufruf der Methode, die die Dateien und Verzeichnisse auflistet, bekommt man eine
FtpItemCollection
zurück, welche bei mir eine Length
von 697 hat. Es werden einfach alle Dateien aufgelistet, ohne Subitems oder ähnliches, was das Ganze deutlich einfacher machen würde. Jedes Item hat wie gesagt nur einen ParentPath
, über den ich das Ganze machen möchte.Dies ist meine Methode, die dann die Subitems initialisieren soll:
C#-Quellcode
- private void InitializeSubItems(ListingItem currentItem, string rootDirectoryName, int pathLength)
- {
- List<FtpItem> subItems =
- _listedFtpItems.Where(
- item =>
- item.ParentPath.Split('/').Count(x => x != String.Empty) == pathLength &&
- item.ParentPath.StartsWith(String.Format("/{0}", rootDirectoryName))).ToList();
- currentItem.SubItems = subItems.Select(item => new ListingItem(item.Name));
- foreach (var subItem in currentItem.SubItems.Where(subItem => !Path.HasExtension(subItem.Text)))
- {
- InitializeSubItems(subItem, rootDirectoryName, pathLength + 1);
- }
- }
Das ist der Aufruf:
C#-Quellcode
- try
- {
- _listedFtpItems = _ftp.ListDirectoriesAndFiles("/", true).ToList();
- }
- catch (Exception ex)
- {
- Invoke(
- new Action(
- () =>
- {
- Popup.ShowPopup(this, SystemIcons.Error, "Error while listing the server data.", ex,
- PopupButtons.Ok);
- Close();
- }));
- }
- if (_listedFtpItems != null)
- {
- foreach (var listedItem in _listedFtpItems.Where(item => item.ParentPath.Length < 2))
- {
- var listingItem = new ListingItem(listedItem.Name);
- if (!Path.HasExtension(listedItem.Name)) // Only if it is a directory
- InitializeSubItems(listingItem, listedItem.Name, 1);
- _foundItems.Add(listingItem);
- }
- }
Das macht folgendes, es listet die Dateien und Ordner auf, listet dann diejenigen auf, deren
ParentPath
kleiner 2 ist (also nur "/"), um somit dann die Root-Items aufzulisten und dann wird mit diesem Root-Item, also einem, dass im Root-Directory des Servers liegt, ein neues ListingItem
erzeugt.Mit genau diesem wird dann die Methode aufgerufen, die rekursiv alle SubItems auflisten soll.
So, soweit geht es eigentlich, nur fügt der Code ab dem Zeitpunkt, wo die PathLength 2 ist, keine SubItems mehr hinzu, diese Property ist dann
null
.Die Ordner im Root haben SubItems, aber halt genau diese haben jeweils keine SubItems mehr. Ich weiß nicht warum. Eigentlich müsste "InitializeSubItems" das doch rekursiv laden, denn ich gebe ja immer die aktuelle
ListingItem
-Instanz mit.Ich habe dann mit Haltepunkten debuggt und festgestellt, dass die Linq-Queries alles richtig machen, beim Debuggen werden auch rekursiv alle SubItems richtig hinzugefügt, nur beim Zuweisen am Ende gibt es anscheinend ein Problem. Theoretisch müsste das aber doch eigentlich immer die selbe Instanz sein, oder?
Ich gehe stark davon aus, dass das Problem hier liegt, denn beim Debuggen geht es, nur am Ende will er nicht richtig.
So sollte es z. B. aussehen:
/test/css/core.css
Am Ende kommt aber nur das raus:
/test/css
Das ist bei jedem Item in
_foundItems
so.Es muss also am Zuweisen liegen, denn beim Debuggen wurden bei jedem Aufruf der Methode immer die richtigen SubItems rekursiv hinzugefügt, wie gesagt, die Instanz sollte aber stimmen.
Sieht jemand den Fehler? Ich bin mit meinem Latein am Ende, da ich das Ganze intensiv planen und in Code umsetzen musste, weil das hier eben schwieriger ist.
Grüße
#define for for(int z=0;z<2;++z)for // Have fun!
Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose!
Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da
Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose!
Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da