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:
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.:
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:
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:
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.
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 ;)
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.
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 ;)
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ż :)