Laden...

Basispfad aus vollem Pfad entfernen (C:\Daten\Bilder\Heute ==> Bilder\Heute)

Erstellt von caoimhin vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.112 Views
Thema geschlossen
C
caoimhin Themenstarter:in
34 Beiträge seit 2010
vor 12 Jahren
Basispfad aus vollem Pfad entfernen (C:\Daten\Bilder\Heute ==> Bilder\Heute)

Hallo,

nachdem ich nun vieles probiert und gelesen habe wende ich mich nun an euch. Ich würde gerne in meiner Anwendung Verzeichnisse durchsuchen und Auflisten. Das durchlaufen der Verzeichnisse funktioniert auch (dank codeschnipsel von hier).

Basis Pfad = "C:\Daten" (das soll variabel sind, evtl auf einem Netzlaufwerk laufen damit mehr als nur 1 Client zugreifen kann)

Die Ausgabe ist allerdgins nicht so wie es möchte. Bisher sieht es so aus :

C:\Daten\Bilder\Heute
C:\Daten\Bilder\Heute\Vormittag
C:\Daten\Bilder\Gestern
C:\Daten\Bilder\Morgen
C:\Daten\Bilder\Vorgestern

Ich würde die Ausgabe aber gern so sehen

\Bilder\Heute
\Bilder\Heute\Vormittag
\Bilder\Gestern
\Bilder\Morgen\
\Bilder\Vorgstern\

Vielleicht habe ich falsch gesucht, ich kann mir aber kaum vorstellen das sowas nicht schon mal benötigt wurde. Mein Versuch mit der URI Klasse schlug fehl da auch dort immer der komplette pfad ausgeben wurde.

Für einen Denkanstoß wäre ich dankbar...

Caoimhin

Das hoffen wir alle

C
1.214 Beiträge seit 2006
vor 12 Jahren

Das einfachste wäre, direkt mit den Strings zu arbeiten, und z.B. am Anfang den Basispfad zu löschen, entweder mit Remove oder Replace.

1.346 Beiträge seit 2008
vor 12 Jahren

System.IO.Path.Combine ist bei sowas die beste Lösung

Hinweis von herbivore vor 12 Jahren

Path.Combine kann (und sollte) man benutzen, um den Basispfad vor einen relativen Pfad zu setzen, aber man kann damit nicht den Basispfad aus einem absoluten Pfad entfernen und einen relativen Pfad zu bekommen.

Gelöschter Account
vor 12 Jahren

Ich wüsste nicht wie das mit Combine einzeilig erledigt wäre.
Aber ich traue der Path Api eh nicht über den Weg.

Hinweis von herbivore vor 12 Jahren

Solange du diese Ansicht nicht begründest, bleibt es bei der Empfehlung für Operationen auf Pfaden nach Möglichkeit die Path-Klasse zu benutzen. Mir sind keine Gründe bekannt, die dagegen, aber viele die dafür sprechen.

M
71 Beiträge seit 2008
vor 12 Jahren

System.IO.Path.Combine ist bei sowas die beste Lösung

Combine benutzt man doch um einen Pfad zu erstellen, nicht um einen Teil zu extrahieren.

Am einfachsten wäre es wenn du mit den String Funktionen IndexOf und Substring arbeitest, wie Coder007 schon gesagt hat.

276 Beiträge seit 2007
vor 12 Jahren

Hallo zusammen,

@caoimhin


string path = @"C:\Daten\";

            string[] a = Directory.GetDirectories(path, "*", SearchOption.AllDirectories);

            foreach (string s in a)
            {
                Console.WriteLine(s.Substring(path.Length-1));
            }

            Console.ReadLine();

ist das das, was du suchst? Pass aber auf, was Zugriffsrechte angeht, wenn du auf Systemordner zugreifst.

Gruss und guten morgen

nitro

Hinweis von herbivore vor 12 Jahren

Der Code dient ja nur zur Auflistung der Verzeichnisse, also den Teil, den caoimhin schon erledigt hat und hat zudem das von dir angerissene Problem, dass eine Exception fliegt, sobald nur für ein einziges Verzeichnis die Zugriffsrechte fehlen. Es ist also besser, wenn caoimhin bei seinem jetzigen Vorgehen bleibt, vermutlich [Snippet] Verzeichnisse und Dateien rekursiv durchlaufen.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo caoimhin,

wenn du den Basispfad entfernen willst, geht das wie schon weiter oben gesagt mit String.Replace oder mit String.Substring. String.IndexOf brauchst du dagegen nicht, weil du den Basispfad und vor allem seine Länge ja schon kennst.

Davon abgesehen ist es aber auch so, dass Directory.GetDirectories (und auch Directory.GetFiles) das als Basispfad einsetzen, was man als Parameter übergibt. Wenn man also in das Verzeichnis C:\Daten wechselt (Environment.CurrentDirectory) und dann Directory.GetDirectories (".") aufruft, wird "." als Basispfad verwendet, also z.B. .\Bilder\Heute und damit ist man ziemlich nah an dem dran, was du willst und sogar noch ein bisschen besser, weil man bei \Bilder\Heute irreführend annehmen könnte, dass dies ein absoluter Pfad ist, also das Verzeichnis Bilder im Wurzelverzeichnis liegt, dabei liegt es ja im Unterverzeichnis Daten. Allenfalls Bilder\Heute wäre noch eine (korrekte) Alternative, die man allerdings mit Directory.GetDirectories nicht hinbekommt, weil man es nicht mit dem leeren String ("") aufrufen darf.

Das fällt aber alles unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

Davon abgesehen hat es nichts mit dem GUI zu tun ==> verschoben nach Basistechnologien.

herbivore

5.742 Beiträge seit 2007
vor 12 Jahren
Thema geschlossen