web-dev-qa-db-ja.com

ディレクトリパス変数の最後にスラッシュを付ける必要がありますか?

ディレクトリへのパスを変数または定数として定義する場合、末尾のスラッシュで終了する必要がありますか?コンベンションとは何ですか?

UNIXのpwdは、末尾のスラッシュなしで現在のディレクトリを表示し、タブはcd /var/www/apps/には末尾のスラッシュが含まれているため、不明な点があります。

75
meleyal

たとえば、ファイルを保存するディレクトリを定義するときに、末尾のスラッシュを含めません。それは私がそれを次のように使用するからです

$store_file = "$store_path/$file_id";

ディレクトリパスを保持することになっている変数を使用する前に、常に末尾にスラッシュを追加します。末尾のスラッシュが含まれているかどうかを疑問視するよりも、常に1つを追加する方が良いと思います。

21
Johan Soderberg

末尾のスラッシュを使用する理由は次のとおりです。

  1. 「スラッシュで終わる場合はディレクトリです。そうでない場合はファイルです。」覚えやすい慣習です。

  2. 少なくとも私がよく使用するOSでは、スラッシュを2倍にしても問題はありませんが、スラッシュを省略すると大きな問題が発生します。したがって、スラッシュを変数に入れて、それを使用するときに「$ path/$ file」を使用するのが最も安全です。

87
Dave Sherohman

はい:

パス名+ファイル名=完全修飾ファイルの場所。

したがって、最後のディレクトリとファイル名の間のスラッシュは、パス名の末尾またはファイル名の先頭のいずれかにする必要があります。ファイル名の前に/を付けると、ファイルを開くだけの場合(つまり、修飾されていないファイル名が現在の作業ディレクトリにあると想定する場合)に、これを考慮する必要があります。

9
PaulJWilliams

ディレクトリパスを格納するとき、またはAPIからそれらを返すときはいつでも、末尾のスラッシュを維持するという慣習に固執します。これにより、「ファイルかディレクトリか」というあいまいさが完全に回避されます。

補遺
これは、末尾のスラッシュまたはその不在を許容できるメソッドを使用する代わりになることを意図していません。この規則を使用しても、Path.Combine(...)および同様のメソッドを常に使用します。

5
jerryjvl

たぶん、あなたの決定がファイルに意味するものについて考える必要があります。 ディレクトリの名前の末尾にスラッシュを含めない場合は、fileの名前の先頭に追加する必要があります。

今、何らかの理由で文字列を連結するときにファイルに至るパスが見つからない場合、/filenameのようなものになります。これは単なるファイルではなく、ルートディレクトリからの絶対パスですその文脈で)。

そのため、パスをスラッシュで終了し、ファイルをファイルとして保持します。

4
DanMan

私はこれが10年前であることを知っていますが、私は非常に思慮深い$ 0.02を投入したかったです。

いいえ。いいえ。

Unixシステムについて話しています。ディレクトリ自体を参照すると、他のノードと同様のノードです。ディレクトリを参照する場合、名前にエスケープされていないスラッシュを含めることはできません(参照:dirnamepwd~echo $HOMEecho $PATHlsなどからの出力)。

ディレクトリの内容を参照する場合、thenスラッシュが必要です。つまり、ls /home/karl/の方がls /home/karlよりも適切です(FTR、私はほとんどの場合、後者を行います...怠け者だからです)。

ディレクトリを含む変数を使用してファイルへのフルパスを作成する場合、常にスラッシュを含めることが期待されます(つまり、cp ${HOME}/test ${OTHER_DIR}/)。

ディレクトリがスラッシュで終了しないことはexpectedです。ディレクトリがスラッシュで終わるという期待は間違っています。したがって、*_DIR変数の値の最後にスラッシュを追加すると、期待が覆されます。

それが間違っているからといって、ツール/パッケージ/ライブラリがそれを絶対にしないというわけではないことに注意してください。そのようなものが存在しない場合に末尾のスラッシュが追加されることは、ごく一般的なことです。したがって、 BevanPaul F の両方が示唆したように、サードパーティのツールを使用する場合は、ディレクトリ名に存在する可能性のある末尾のスラッシュを削除することをお勧めします。

Unix iノード

Iノード(インデックスノード)は、ファイルやディレクトリなどのファイルシステムオブジェクトを記述するUnixスタイルのファイルシステムのデータ構造です。

- https://en.wikipedia.org/wiki/Inode

ファイルシステム階層標準

Unixファイルシステムの標準(Filesystem Hierarchy Standard、AKA FHS)は、ディレクトリの末尾にスラッシュがあるとは考えられず、ディレクトリの内容がスラッシュ(唯一の例外は/です。これは、空の文字列を使用してファイルシステムのルートを参照しないためです...とにかくそこにファイルを作成しないでください。)

- http://www.pathname.com/fhs/pub/fhs-2.3.html

- https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard

4
Karl Wilbur

Phpでは、dirname(__ FILE __)関数が最後にスラッシュなしでディレクトリ名を返すため。私はその慣習に固執する傾向があります。

そうしないと、ディレクトリ名の最後にスラッシュを使用するとdirname(..)の動作と競合し、ディレクトリ名がdirname(..から来たものかどうかわからないため、2つのケースを処理できなくなります。 )末尾のスラッシュで定義された関数または定数。

下線: dirname(..)は使用しないため、末尾のスラッシュを使用しないでください。

// PHP Example
dirname(__FILE__); // returns c:\my\directory without a trailing slash, so stick to it!

他の言語については、パス名を抽出する関数を確認し、末尾のスラッシュを使用しているかどうかを確認してから、言語の規則に従ってください。

4
Basil Musa

私はこれが古いスレッドであることを知っていますが、私は自分のしていることを共有したいと思っていました。可能であれば、通常は両方を許可し、次のようなことを行います(PHPの場合)。

$fullPath = rtrim($directory, '/') . '/filename.txt');

そうすれば、ディレクトリが設定ファイルで定義されている場合、次に変更する人が末尾のスラッシュを含むかどうかは関係ありません。

4
Paul F

そのディレクトリを使用してファイルを追加/取得する可能性が高いため、末尾のスラッシュを追加する傾向があります...

Web参照に関しては、実際にパフォーマンスを向上させることができます。

http://www.netmechanic.com/news/vol4/load_no11.htm

3
James

はい、拡張子のないファイルをサポートするファイルシステムがたくさんあるので、問題を避けるために常に末尾にスラッシュを追加してください。

2
maxp

いずれにせよ、堅実なコンベンションを見たことはありません。

しかし、あなたが何に落ち着いたとしても、他の誰かがそれが他の方法であるべきであることを100%確信することはかなり確かです。だから、最善のアイデアは、いずれにせよ設定されているものを許容することです。

.NETの世界では、Path.Combine()がこれを処理する方法を提供します。他の環境にも、cmdファイルから同等のものがあります。

1
Bevan