2012-06-14 17 views
13

Jak określić bezwzględną ścieżkę do pliku lub katalogu z podanej ścieżki względnej w C/C++ na GNU/Linux?
Wiem o realpath(), ale nie działa w nieistniejących plikach.Jak uzyskać bezwzględną ścieżkę do pliku lub katalogu, która * nie * istnieje?

Załóżmy, że użytkownik wchodzi na ../non-existant-directory/file.txt, a katalog roboczy programów to /home/user/.
Potrzebuję funkcji, która zwraca /home/non-existant-directory/file.txt.

Potrzebuję tej funkcji, aby sprawdzić, czy dana ścieżka znajduje się w określonym podkatalogu, czy nie.

+0

Nie sądzę, aby coś takiego zostało wbudowane. Będziesz musiał napisać kod samodzielnie. –

Odpowiedz

10

Wypróbuj realpath. Jeśli się nie powiedzie, zacznij usuwać komponenty ścieżki od końca po kolei i ponawiaj próbę odświeżania aż do skutku. Następnie dołącz ponownie usunięte komponenty do wyniku pomyślnego wywołania realpath.

Jeśli masz pewność, że katalog zawierający istnieje i chcesz tylko utworzyć tam plik, musisz usunąć najwyżej jeden składnik.

Innym podejściem byłoby po prostu utworzenie pliku, a następnie wywołanie realpath.

+0

pierwsze rozwiązanie zadziałało, dzięki! –

0

Można uzyskać aktualny katalog i zastosować następującą logiką:

Jeśli ścieżka zaczyna się od „/”, należy wymienić aktualny katalog z korzenia

Dla każdego katalogu wymienionego na ścieżkę względną wykonać następujące:

  • Jeśli jesteś na ostatniej części ścieżki względnej, dołączyć go do ścieżki bieżącego katalogu i zatrzymać: ścieżka bieżącego katalogu jest ścieżka bezwzględna.

  • W przeciwnym razie: Sprawdź, czy taki katalog pod bieżącym katalogiem istnieje.

  • Jeśli istnieje, ale nie jest katalogiem, błąd sygnału (chyba ostatni wpis w ścieżce)

  • Jeśli istnieje i jest katalogiem, sprawdzić, czy jest dowiązaniem symbolicznym (w systemach operacyjnych obsługujących tę funkcję). Jeśli tak, zastąp aktualny katalog wskazanym katalogiem dowiązania symbolicznego.

  • Jeśli istnieje, i jest to katalog, ale nie jest to link symboliczny, dołączyć do tego katalogu do ścieżki bieżącego katalogu (tj zastąpić bieżący katalog z podkatalogu zaznaczone)

  • Jeśli nie istnieje, dołącz pozostałe części względnej ścieżki do ścieżki bieżącego katalogu i zatrzymaj się.

+2

To jest zasadniczo ponowne wdrażanie 'realpath' i znacznie więcej pracy niż potrzebujesz. –

Powiązane problemy