Czy definiując ścieżkę do katalogu jako zmienną lub stałą, należy ją kończyć końcowym ukośnikiem? Jaka jest konwencja?
pwd
w Unixie pokazuje twój bieżący katalog bez końcowego ukośnika, podczas gdy tabulator cd /var/www/apps/
zawiera końcowy ukośnik, co nie jest pewne.
'///' + $root + '//' + $file + '/'
a to nie ma znaczenia. Chociaż posiadanie końcowego ukośnika jest dobrym sposobem na rozróżnienie, czy ścieżka jest plikiem lub katalogiem, lepiej byłoby dołączyć do ścieżek takich jak'/' + $root
zamiast,$root + '/'
ponieważ nie można być pewnym, że dołączana ścieżka ma końcowy ukośnik , ale możesz mieć względną pewność, że wiele ukośników zostanie zinterpretowanych jako pojedynczy ukośnik w większości środowisk./tmp/store_data/
będzie to katalog, podczas gdy nie jest jasne, czym jest ta sama ścieżka bez traling slash/tmp/store_data
rm -rf $foo/$bar
może kończyć się narm -rf /
Idę z końcowym ukośnikiem, ponieważ:
„Jeśli kończy się ukośnikiem, jest to katalog. Jeśli nie, to plik”. to łatwa do zapamiętania konwencja.
Przynajmniej w systemach operacyjnych, z których często korzystam, podwojenie ukośnika nie powoduje żadnych problemów, a pominięcie ukośnika powoduje duże. Dlatego najbezpieczniej jest zarówno umieścić ukośnik w zmiennej, jak i użyć „$ path / $ file” podczas jej używania.
źródło
A pathname that begins with two successive slashes may be interpreted in an implementation-defined manner, although more than two leading slashes shall be treated as a single slash.
w większości przypadków zaobserwowano, że podwójne ukośniki są zwykle interpretowane jako pojedynczy ukośnik w typowych implementacjach.Wiem, że to ma 10 lat, ale chciałem dorzucić moje bardzo uparte 0,02 dolara.
Nie. Absolutnie nie.
Mówimy o systemie Unix. W odniesieniu do samego katalogu jest to węzeł jak każdy inny. Odnosząc się do katalogu, to nie powinien nigdy mieć Niecytowany ukośnik w nazwie (ref:
dirname
,pwd
,~
,echo $HOME
,echo $PATH
, wyjście zls
et al).W przypadku oznaczania zawartości danego katalogu, następnie trzeba ukośnik. To znaczy,
ls /home/karl/
jest bardziej odpowiednie niżls /home/karl
(FTR, prawie zawsze robię to drugie, ponieważ ... cóż, leniwy).Korzystając ze zmiennej zawierającej katalog do utworzenia pełnej ścieżki do pliku, zawsze należy spodziewać się umieszczenia ukośnika (tj., E:)
cp ${HOME}/test ${OTHER_DIR}/
.Jest on oczekuje , że katalog nie kończy się ukośnikiem. Wszelkie oczekiwania, że katalog kończy się ukośnikiem, są błędne. Zatem dodanie ukośnika na końcu wartości
*_DIR
zmiennej podważyłoby oczekiwania.Jeśli chodzi o wypełnianie kart, oczekuje się, że przejdziesz do tego katalogu. Tak więc pomoc zapewniana przez wypełnianie kart polega na przeniesieniu Cię do tego katalogu, abyś mógł dokonać następnego wyboru na podstawie jego zawartości.
(odniesienie do komentarzy: Filepath Misconceptions , ze strony Wikipedii
Talk:Path_(computing)
. Dzięki, john cj )Warto zauważyć, że tylko dlatego, że jest źle, nie oznacza, że narzędzia / pakiety / biblioteki nigdy tego nie robią. Jest to zbyt częste zdarzenie, że takie rzeczy dodają końcowy ukośnik, gdy żadna nie powinna istnieć. Dlatego, jak sugerowali Bevan i Paul F.
I-węzły systemu Unix
- https://en.wikipedia.org/wiki/Inode
Filesystem Hierarchy Standard
Standard dla systemu plików Unix (System plików Hierarchy Standard, AKA FHS) wyraźnie pokazują, że katalogi nie są traktowane jako posiadające ukośnik, ale zawartość katalogu rozpoczyna się ukośnikiem (jedyny wyjątek to
/
dlatego, że nie będzie odnosić się do katalog główny systemu plików, używając pustego ciągu ... i tak czy siak nie powinno się tam tworzyć plików.)- http://www.pathname.com/fhs/pub/fhs-2.3.html
- https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
źródło
/
łamie schemat. A jeśli miałbyś zacząć swoje rozumowanie od tego miejsca (rekurencyjnie), możesz następnie dojść do sprzeczności, które mogą stanowić sedno rozbieżnych praktyk (czego dowodzą odpowiedzi tutaj). Ale kiedy zaakceptujesz to jako wyjątek, wszystko inne będzie zgodne./.
, to po prostu okropny pomysł; Oprócz wstrzykiwania bardzo nietypowych treści, które powodują nieoczekiwane problemy, wygląda to po prostu głupio.Tak, powinno, ponieważ:
Nazwa ścieżki + nazwa pliku = w pełni kwalifikowana lokalizacja pliku.
Zatem ukośnik między ostatnim katalogiem a nazwą pliku musi znajdować się na końcu ścieżki lub na początku nazwy pliku. Przedrostek nazw plików znakiem / oznacza, że musisz wziąć to pod uwagę, jeśli chcesz tylko otworzyć plik (tj. Jeśli zakładasz, że niekwalifikowana nazwa pliku znajduje się w bieżącym katalogu roboczym).
źródło
Za każdym razem, gdy przechowuję ścieżki katalogów lub zwracam je z interfejsów API, staram się trzymać konwencji utrzymywania końcowego ukośnika. Pozwala to uniknąć całej niejednoznaczności „czy to plik czy katalog”.
Dodatek :
nie ma to zastępować stosowania metod, które mogą tolerować końcowy ukośnik lub jego brak. Nawet stosując tę konwencję zawsze używam
Path.Combine(...)
i podobnych metod.źródło
os.path.join(dir, subdir_or_file)
Może powinieneś pomyśleć o tym, co Twoja decyzja oznaczałaby dla plików. Jeśli nie dodasz ukośnika na końcu nazwy katalogu , będziesz musiał dodać go na początku nazwy pliku .
Teraz, jeśli z jakiegoś powodu brakuje ścieżki prowadzącej do pliku podczas łączenia ciągów, otrzymujesz coś takiego,
/filename
co nie jest tylko plikiem, ale ścieżką bezwzględną z katalogu głównego (gdziekolwiek to może być w tym kontekście) .Dlatego kończę moje ścieżki ukośnikiem i zachowuję pliki jako pliki.
źródło
./filename
. Ale generalnie to kod łączący ścieżki powinien odpowiadać za wykonanie tego poprawnie - i nie czynić żadnych założeń.Wiem, że to stary wątek, ale pomyślałem, że podzielę się tym, co robię. Jeśli to możliwe, normalnie pozwoliłbym na oba i zrobiłbym coś takiego (jeśli to było PHP):
W ten sposób, jeśli katalog jest zdefiniowany w pliku konfiguracyjnym, nie ma znaczenia, czy następna osoba, która go zmieni, będzie zawierała końcowy ukośnik, czy nie.
źródło
W php, ponieważ dirname (__ FILE __) funkcja zwraca nazwę katalogu bez ukośnika na końcu. Mam tendencję do trzymania się tej konwencji.
W przeciwnym razie użycie ukośnika na końcu nazwy katalogu spowoduje konflikt ze sposobem działania dirname (..), a następnie utkniesz z obsługą tych dwóch przypadków, ponieważ nie wiesz, czy nazwa katalogu pochodzi z katalogu (.. ) lub treść zdefiniowaną za pomocą końcowego ukośnika.
Podsumowanie: Nie używaj końcowego ukośnika, ponieważ dirname (..) tego nie robi.
W przypadku innych języków sprawdź funkcję, która wyodrębnia nazwę ścieżki i zobacz, czy używa końcowego ukośnika, czy nie, a następnie trzymaj się konwencji języka.
źródło
Zwykle po prostu dodam końcowy ukośnik, ponieważ najprawdopodobniej zamierzam użyć tego katalogu do dodawania / pobierania plików ...
Jeśli chodzi o odwoływanie się do stron internetowych, może to faktycznie zwiększyć wydajność, pozostawiając końcowy ukośnik
http://www.netmechanic.com/news/vol4/load_no11.htm
źródło
Tak, jest wiele systemów plików, które obsługują pliki bez żadnych rozszerzeń, więc zawsze dodawaj końcowy ukośnik, aby uniknąć problemów.
źródło
I tak nigdy nie widziałem mocnej konwencji.
Jestem jednak całkiem pewien, że cokolwiek się zdecydujesz, ktoś inny będzie w 100% pewien, że powinno być inaczej. Dlatego najlepszym pomysłem jest tolerowanie tego, co jest ustawione w obie strony.
W świecie .NET Path.Combine () daje sposób na rozwiązanie tego problemu - istnieją odpowiedniki w innych środowiskach, od plików cmd w górę.
źródło
Myślę, że jest to jeden z tych rzadkich przypadków, w których poprawna odpowiedź teoretyczna i praktyczna jest inna.
Wydaje się, że odpowiedź @Karl Wilbur jest z pewnością poprawna w sensie teoretycznym, ponieważ powinieneś być w stanie odróżnić odniesienie do samego węzła katalogu od zawartości katalogu.
Ale w praktyce będę twierdzić, że prawidłowa odpowiedź jest odwrotna:
Najważniejszym powodem jest to, że można z całą pewnością stwierdzić, że ścieżka
/home/FSObjectX/
jest folderem, podczas gdy/home/FSObjectX
jest niejednoznaczna. Nikt nie może powiedzieć, czy jest to plik folderu.Specyfikacje powinny być zawsze dokładne i jednoznaczne, gdy tylko jest to możliwe.
W zdecydowanej większości przypadków zawsze będziesz odnosić się do zawartości folderu, a nie do samego węzła katalogu.
W tych rzadkich przypadkach, gdy faktycznie to robisz, można to łatwo obsłużyć w kodzie, usuwając opcjonalny końcowy separator dir.
Używanie podwójnych separatorów dir nie zaszkodzi, chociaż na pewno brak jednego.
Teoretycznie zły argument, ponieważ nie powinieneś kodować przez przypadek, ale w praktyce zdarzają się błędy i być może użycie końcowego katalogu dir-sep może skończyć się mniejszą liczbą błędów uruchomieniowych u użytkownika końcowego.
Czytając ten interesujący wątek, nie znalazłem żadnych wad używania trailing dir-sep, tylko że jest to błędne w sensie teoretycznym. A może coś przegapiłem?
źródło