例では:
var assets = "images/"
var sounds = assets+"sounds/"
ファイルパスの後ろにスラッシュを置くのがより一般的ですか?
var assets = "/images"
var sounds = assets+"/sounds"
良い一般的な方法である別の方法はありますか?
File.separator
、File
とPath
APIは両方/
と `\`を受け入れます。
例では:
var assets = "images/"
var sounds = assets+"sounds/"
ファイルパスの後ろにスラッシュを置くのがより一般的ですか?
var assets = "/images"
var sounds = assets+"/sounds"
良い一般的な方法である別の方法はありますか?
File.separator
、File
とPath
APIは両方/
と `\`を受け入れます。
回答:
ほぼすべての主要なプログラミング言語には、ディレクトリセパレータを処理するライブラリがあります。それらを活用する必要があります。これにより、コードが簡素化され、バグが防止されます。
私の経験では、このような文字列を組み合わせる通常の理由は、それらが異なるソースから来るということです。構成ファイルとは異なる場合があります。時々、それは関数の引数と結合する定数です。いずれの場合でも、それらが異なるソースからのものである場合、結合する両端のセパレーターに関して考えられるいくつかの異なるケースを考慮する必要があります。
"images/"
と"/sounds"
"images"
し、"/sounds"
あるいは"images/"
と"sounds"
"images"
および"sounds"
各部分が異なるソースからのものであるという事実は、誰かがそれを考えた場合、従うべき規則について各ソースが独自のアイデアを持っている可能性があることを意味します!コードを呼び出すものは何でも、これについて心配する必要はありません。誰かがあなたの慣習に違反するので、あなたのコードはすべてのケースを処理すべきです。これにより、エラーの原因を調査して修正を行うのに無駄な時間がかかります。同僚が構成ファイル内でパスをどのようにフォーマットするかについて不愉快な思いをすることが何度かありました。つまり、コードを探し出して、何を期待しているか(またはコードを修正)する必要がありました。
ほとんどの主要言語には、すでに多くのケースを処理する方法が用意されています。
os.path.join
Python用File.join
Ruby用Path.join
Node.jsの場合Paths.get
Java(7以降)Path.Combine
.NET用これらには注意点があります。これらの多くは、2番目の引数の先頭のディレクトリセパレータがルートパスを参照し、これが最初の引数を完全に削除する必要があることを前提としているようです。これがなぜ有用であると考えられるのかわかりません。私にとっては、それは単に問題を引き起こします。2つのパス部分を組み合わせて、最初の部分がドロップされることはありませんでした。特別なケースについてはドキュメントを注意深く読み、必要であれば、特別な処理の代わりにこれらで必要なことを行うラッパーを作成してください。
さらに、異なるオペレーティングシステムをサポートする必要がある場合にも役立ちます。これらのクラスは、ほぼどこでも正しいセパレーターの選択を説明しています。ライブラリには通常、OSの規則に合わせてパスを正規化する方法もあります。
プログラミング言語にすぐに使用できるライブラリがない場合は、これらすべてのケースを処理するメソッドを記述し、それをプロジェクト間で自由に使用する必要があります。
これは、「想定しない」および「役立つツールを使用する」というカテゴリに分類されます。
C:\Documents and Settings\Admin
とうまく組み合わせて作成できるライブラリを使用していましたが、これはかわいいトリックですが、現実の世界では、ヒューリスティックによって修正されたよりも多くのバグが発生しました。my folder:document.txt
/home/admin/my folder/document.txt
Paths.get()
、シングルString
をPath
オブジェクトに変換するだけです。パスを結合するにPath.resolve()
は、別のPath
またはを取り込むことができるを使用しますString
。Path
クラスには他にもさまざまな方法でパスを結合できるメソッドがあります。
Paths
あまりよく読んでいないようです。
[System.IO.Path]::Combine("abc", "\def")
説明された動作を持つ.NETメソッドの代替は、Join-Path "abc" "\def"
を与えるコマンドレット"abc\def"
です。
Javaでは、答えは「上記のどちらでもない」でしょう。ベストプラクティスは、java.io.File
クラスを使用してパス名をアセンブルすることです。例えば
File assets = new File("images");
File sounds = new File(assets, "sounds");
このFile
クラスは、プラットフォーム固有のパス名セパレータも処理します。
パス名をスラッシュで開始するかどうかの別の問題があります。しかし、それはベストプラクティスよりも正確さに関係しています。スラッシュで始まるパス名は、そうでないパス名とは異なるものを意味します !!
コア(ECMA)Javascriptライブラリでのパス名処理の明示的なサポートはありませんが、(少なくとも)Node.jsはPathモジュールを介してサポートを提供します。
os.path.join
ます。PowerShellは持っていjoin-path
ます。この答えに何かを追加します。複数のファイルパスが必要な場合、特定の場所にファイルパスがあると仮定すると、コードが非常に脆弱になることがわかりました。これらのクラスを使用すると、移植性が向上するだけでなく、考えられるすべてのエッジケース(結合される両端のスラッシュ、片側のみのスラッシュ、まったくスラッシュなし)も処理されます。構成ファイルにファイルパスをドロップする場合、この柔軟性は非常に重要です。
.NETでは、Path.Combineメソッドを使用する必要があることに注意してください。
var path = System.IO.Path.Combine("assets", "sounds");
これは、フォルダ名を作成するときに使用される正しい文字を「認識」しているためです。
これにより、事前または事後修正の「問題」がなくなります。
os.path.join('src', '../../../your_secret_stuff')
が、Pythonでは有効です。つまり、これらのメソッドをユーザー入力で盲目的に使用しないでください。
フォルダーとファイルの違いは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つの相対パスを連結しても問題はありませんが、プログラムが相対パスの相対位置を知らない場合、未定義の動作を引き起こす可能性があります。
var a = "/my/path" + "css/" + "test.css"; //Output: "/my/pathcss/test.css"
absolutepath
パスであるため、スラッシュで終了する必要がありました。どういうわけか私はこれを書いたときにそれを見落としていました。
パスを実装する方法について魔法や「一般的な慣行」はないと思いますが、確かに文字列の連結は進むべき方法ではありません。ケースを処理するための独自のAPIを開発できますが、多少の努力が必要になる場合があります。特に、異なるプラットフォームに注意する必要があります。たとえば、Windowsでは\
区切り記号が、Unixベースのシステム/
では区切り記号が使用されます。
私はJavascriptライブラリに精通していませんが、これらのケースを処理するためのライブラリがあるはずです。たとえば、Javaでは、Path APIを使用して、プラットフォームに依存しないパス操作を処理できます。
/
パスファイル名の区切り文字としてサポートしています。これにはコマンドラインでの癖が必要ですが、ファイルI / O APIはスラッシュでうまく動作します。
私の個人的な好みはこれです:
var assets = "/images"
var sounds = assets+"/sounds"
私は常に絶対パス(/images/...
)を使用します。エラーが発生しにくいと感じています。末尾のスラッシュがあり、あなたが終わったとしても、それはまだ解決するvar sounds = assets+"/sounds"
ので、使用するのはより馬鹿な証拠assets
です。1つの免責事項は、リクエストハンドラに依存するということです。Apacheはそれをうまく処理しているようです(少なくとも特定のバージョン/構成、http://www.amazon.com//gp//site-directory//ref=nav_sadを参照)。他の方法では、最終的にで終わることになりますが、それほど簡単な証拠ではありません。他のアプローチのオプションではありません。/images//sounds
/images/sounds
/imagessounds
/
)で始まるパスは絶対パスであり、相対パスではありません。または、最初のパスセクション以外のパスセクションに対してのみそれを意味しましたか?
/somewhere
は、ホストが含まれていないため、相対パスです。したがって、ブラウザーは現在のページのホストに基づいて検索します。Webの世界でhttp://here/somewhere
は、絶対URIであり、それ/somewhereelse
に対して相対的です。ファイルシステムの世界で/somewhere
は、rootから来る絶対的なもの/
であり、「somewhereelse」は現在の作業ディレクトリに相対的です。
http://here/somewhere
し、絶対パスを持つURIであり/somewhere
、絶対パスをsomewhere/else
持つ相対参照であり、相対パスを持つ相対参照です。どうやら、これらの円では、相対参照を参照するために「相対パス」が使用されています。
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/' / ''
適切な行動を決定するために、など。