web-dev-qa-db-ja.com

ファイルパス文字列を組み合わせる従来の方法はありますか?

例では:

var assets = "images/"

var sounds = assets+"sounds/"

スラッシュをファイルパスの後ろに置くのがより一般的ですか?

var assets = "/images"

var sounds = assets+"/sounds"

一般的な方法である別の方法はありますか?

36
iiridescent

ほぼすべての主要なプログラミング言語には、ディレクトリセパレータを処理するためのライブラリがあります。それらを活用する必要があります。これはコードを簡略化し、バグを防止します

私の経験では、このような文字列を組み合わせる通常の理由は、それらが異なるソースからのものであることです。場合によっては、構成ファイルとは異なる部分があります。時々、それは関数の引数と結合する定数です。どのような場合でも、それらが異なるソースからのものである場合、組み合わせる両端のセパレーターに関していくつかの異なる可能なケースを考慮する必要があります。

  • 両端にセパレータを含めることができます:"images/"および"/sounds"
  • 1つだけにセパレータがあります:"images"および"/sounds"または"images/"および"sounds"
  • どちらにも区切り文字はありません:"images"および"sounds"

各部分が異なるソースからのものであるという事実は、誰かがそれについて少しでも考えた場合、従うべき慣習について各ソースが独自のアイデアを持っている可能性があることを意味します!コードを呼び出すものは何でもこれについて心配する必要はありません。誰かが規約に違反するため、コードはすべてのケースを処理する必要があります。これにより、エラーの原因を調査して修正を行うのに無駄な時間がかかります。同僚がパスを構成ファイルでどのようにフォーマットする必要があるかを想定した不愉快な状況が何度かありました。つまり、コードを探して、彼らが期待していることを理解する(またはコードを修正する)必要がありました。

ほとんどの主要言語では、これを行うための方法がすでに提供されています。

これらには注意が必要です。これらの多くは、2番目の引数の先頭のディレクトリセパレータがルートパスを参照し、これは最初の引数を完全に削除する必要があることを想定しているようです。これがなぜ有用であると考えられるのか、私にはわかりません。私にとって、それは問題を引き起こすだけです。 2つのパス部分を組み合わせて、最初の部分が削除されることを望んでいません。特別な場合については、ドキュメントを注意深く読み、必要に応じて、特別な処理ではなく、これらの処理を実行するラッパーを作成してください。

さらに、さまざまなオペレーティングシステムをサポートする必要がある場合にも役立ちます。これらのクラスは、正しいユビキタスを選択するためにほぼどこにでもあります。通常、ライブラリには、OSの規則に合わせてパスを正規化する方法もあります。

プログラミング言語にすぐに利用できるライブラリがない場合は、これらのすべてのケースを処理するメソッドを記述し、プロジェクト間で自由に使用する必要があります。

これは、「想定しないでください」および「役立つツールを使用する」のカテゴリに分類されます。

37
jpmc26

Javaでは、答えは「上記のどちらでもない」でしょう。ベストプラクティスは、Java.io.Fileクラスを使用してパス名をアセンブルすることです。例えば.

File assets = new File("images");
File sounds = new File(assets, "sounds");

Fileクラスは、プラットフォーム固有のパス名区切り文字も処理します。

パス名がスラッシュで始まるべきかどうかという別の問題があります。しかし、それは、ベストプラクティスよりも正確性と関係があります。スラッシュで始まるパス名別の意味でないパス名に!!


コア(ECMA)JavaScriptライブラリではパス名の処理に対する明示的なサポートはありませんが、(少なくとも)Node.jsはPathモジュールを介してサポートを提供します。

38
Stephen C

.NETでは、Path.Combineメソッドを使用する必要があることに注意してください。

var path = System.IO.Path.Combine("assets", "sounds");

これは、フォルダ名を作成するときに使用する 正しい文字 を「知っている」ためです。

これにより、修正前または修正後の「問題」が取り除かれます。

21
Erno

パスを作成するときは、末尾のスラッシュがない場合は追加する関数をよく使用します。次に、パスは次のように構築できます。

filename := fs( 'assets') + fs( 'images') + fs( 'icons') + 'some.png';

fs()は、必要に応じて末尾にスラッシュを追加します。

5
GrandmasterB

フォルダーとファイルは1つの点でのみ異なります。フォルダーの末尾はスラッシュで終わり、ファイルはスラッシュではありません。さらに、絶対パスは/で始まりますが、相対パスはそうではありません。これを一貫して連結したパスとファイルを一緒に使用する場合は問題ありません。

var absolutepath = "/my/path/";
var relativepath = "css/";
var filename = "test.css";
var relativepathtofilename = "js/test.js";

var a = absolutepath + relativepath + filename; //Output: /my/path/css/test.css
var b = absolutepath + relativepathtofilename;  //Output: /my/path/js/test.js

2番目のパスは最初のパスを基準にする必要があるため、2つの絶対パスを連結しても意味がありません。 2つの相対パスを連結しても問題はありませんが、プログラムが相対パスの相対位置を認識していない場合、動作が未定義になる可能性があります。

5
Sumurai8

パスの実装方法には魔法や「一般的な慣習」はないと思いますが、確かに文字列の連結は適切な方法ではありません。ケースを処理するための独自のAPIを開発できますが、多少の労力が必要になる場合があります。特に、異なるプラットフォームに注意する必要があります。たとえば、Windowsでは\は、UNIXベースのシステムでは区切り記号です/はセパレータです。

私はJavaScriptライブラリに精通していませんが、これらのケースを処理するためのライブラリがあるはずです。たとえば、Javaでは、 Path APIを使用して、プラットフォームに依存しないパス操作を処理できます。

4
Wickoo

私の個人的な好みはこれです:

var assets = "/images"

var sounds = assets+"/sounds"

私は常に絶対パス(/images/...)を使用しているので、エラーが発生しにくくなります。 assetsの末尾にスラッシュが付いていてvar sounds = assets+"/sounds"で終わっていても、/images//soundsに解決されるため、/images/soundsを使用するほうが簡単です。免責事項の1つは、要求ハンドラに依存することです。 Apacheはそれをうまく処理しているようです(少なくとも特定のバージョン/構成、 http://www.Amazon.com//gp//site-directory//ref=nav_sad を参照)。もう1つの方法では、最終的には/imagessoundsになり、それほど簡単ではありません:)ダブルスラッシュをチェックしてクリーンアップするオプションもあります。他のアプローチのオプションではありません。

0
rpaskett

Smalltalkでは、次のように機能するようにStringで/メソッドを定義するのは簡単です。

'assets' / 'sounds' => 'assets/sounds'.
'assets/' / 'sounds' => 'assets/sounds'.
'assets' / '/sounds' => 'assets/sounds'.
'assets/' / '/sounds' => 'assets/sounds'.

メソッドの簡単な実装を以下に示します(より良くすることができます)。

/ aString
    | slash first second |
    slash := Directory separator.
    first := self.
    (first endsWith: slash) ifTrue: [first := first allButLast].
    second := aString.
    (second beginsWith: slash) ifTrue: [second := second allButFirst].
    ^first , slash , second

:適切な動作を判断するために、'' / '''x/' / ''などの境界ケースにも注意を払う必要がある場合があります。

0