O dwóch funkcjach do ścieżek

2007-07-31 14:53

Kolejnymi kawałkami kodu z poprzedniej wersji mojej biblioteki uniwersalnej, którym postanowiłem się przyjrzeć, były różnego rodzaju funkcje “systemowe”. Nazwa jest może trochę na wyrost, jako że dotyczyły one głównie pewnych operacji na plikach i ich nazwach. Wśród z nich znalazły więc procedury do pobierania nazw plików, ich rozszerzeń, sprawdzania istnienia plików, tworzenia całych ścieżek katalogów i tym podobne.

Ostały się też dwie najciekawsze funkcje o bardzo podobnych do siebie sygnaturach:

  1. String AbsoluteToRelativePath(const String& strBase, const String& strTarget);
  2. String RelativeToAbsolutePath(const String& strBase, const String& strTarget);

Wykonują one interesującą pracę: konwertują ścieżki względne na bezwzględne i odwrotnie. Jak wiadomo, ścieżka bezwzględna określa położenie w systemie plików w sposób jednoznaczny, np.:

  • C:\Program Files\Taphoo

oznacza podkatalog Taphoo w katalogu Program Files na dysku C – niezależnie od tego, gdzie się teraz znajdujemy. Natomiast ścieżka względna – taka jak ta:

  • ../images/logo.gif

mówi jedynie, że w celu dostania się do pliku logo.gif należy wyjść do nadrzędnego katalogu (..), a stamtąd przejść do katalogu images.

Do czego może przydać się konwersja między oboma typami ścieżek? Dobrym przykładem jest dyrektywa #include w C(++), która akceptuje ścieżki względne:

  1. #include "../Base/StrUtils.hpp"

Preprocesor musi jest rozwinąć, aby móc wstawić zawartość dołączanego pliku. Z użyciem wymienionej wyżej funkcji RelativeToAbsolutePath można łatwo dodać podobną dyrektywę do języka opisu lub skryptowego.

Be Sociable, Share!
Be Sociable, Share!
Tags: , ,
Author: Xion, posted under Programming »


4 comments for post “O dwóch funkcjach do ścieżek”.
  1. Kurak:
    July 31st, 2007 o 22:02

    Ostatnio potrzebowałem konwersji absolute->relative jak pisałem edytor w C# i nie znalazlem żadnej funkcji w siszarpowej bibliotece standardowej. Funkcje przydatne imo właśnie w edytorkach, ew. we wspomnianym w notce języku skryptowym. Aczkolwiek ja i tak zamierzam użyć jakiejś gotowej biblioteki od skryptów ;)

  2. Xion:
    July 31st, 2007 o 22:37

    Rzeczywiście chyba w .NET nie ma nic takiego :) Na szczęście nie jest trudno takie funkcje napisać. Najpierw split na kolejne elementy ścieżki dla obu parametrów, a potem:

    – dla absolute->relative liczymy ilość zgodnych elementów ścieżki począwszy od początku, a potem uzupełniamy odpowiednią ilością “..\” i doklejamy pozostały kawałek drugiej ścieżki

    – dla relative->absolute po prostu parsujemy każde “..” i “.”, obcinając kolejne kawałki ścieżki bazowej i na koniec doklejamy pozostałą część ścieżki docelowej

    Użycia obu funkcji można jednak chyba całkiem uniknąć, jeżeli umiejętnie operuje się Get/SetCurrentDirectory.

  3. KrystianD:
    August 3rd, 2007 o 14:43

    Co do relative->absolute to w .NET mamy świetną klasę Path, a w niej ‘System.IO.Path.GetFullPath’ :) w drugą stronę raczej mniej potrzebna jest konwersja ścieżki ;)

  4. Xion:
    August 3rd, 2007 o 17:08

    Dobrze wiedzieć. Szukałem czegoś takiego właśnie w System.IO, ale obejrzałem głównie klasę Directory, zapominając że przecież w .NET są klasy od wszystkiego – więc takie coś jak Path też :)

Comments are disabled.
 


© 2023 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.