Windowsは\
ファイルパスにバックスラッシュを書くことを主張しているようですが、.NETのURIクラスはそれらをスラッシュで書きます/
。最も原始的なシステムでも受け入れられる正しい方法はありますか? また、.NET の URI が他の Windows と比べて他のスラッシュを示しているのはなぜですか?
12 に答える
Windows はこの点でオペレーティング システムのろくでなしの子ですが、多くの API はスラッシュも受け入れます。Windows では、ファイル パスは次のようになります。
C:\Users\jsmith\Documents\file.txt
Unix ライクなシステム (Mac OS X および Linux を含む) では、同じパスは次のようになります。
/home/jsmith/Documents/file.txt
RFC 1738で標準化された URL では、プラットフォームに関係なく、常にスラッシュが使用されます。
http://home.example.com/Documents/file.txt
この理由は歴史的なものです。Windows でさえ、URL に関する私たちの考え方を覆すことはできません。バックスラッシュについて話している場合、バックスラッシュを使用する唯一のプラットフォームは Windows (およびその他の新しいもの) です。
Windows 以外で使用されているバックスラッシュは UNC パスですが、Windows もこれらの主な支持者です。
\\HOMESVR\Documents\file.txt
そして、何をするにしても、Web サイトのコマーシャルを作成して、「私の会社のドットコム バックスラッシュ プロモーション」と言ってはいけません。
ファイルパスと URI が異なります。\
は、Windows ファイル パスで/
正しく、URI で正しいです。
したがって、このファイル パス:C:\Documents\Foo
は次の URI に変換されます。file:///C:/Documents/Foo
その理由は、歴史のほんの一部です。UNIX、またはむしろ UNICS が作成されたとき、ディレクトリの区切りとして / が選択されました。昔は、ストレージ メディアはかなり小さく、ルート内のすべてのディレクトリは別のマウントされたストレージ デバイス (/bin /lib など) でした。
Microsoft が MS-DOS バージョン 1.0 をリリースしたとき、ディレクトリはサポートされていませんでした。プログラムからのパラメータに / 文字を使用しました (プログラム /a /b)
Q-DOS をすばやくブランド変更した MS-DOS 1.0 は、CP/M から派生したオペレーティング システムであり、そこからドライブ文字 (A: C: など) を継承しています。
それ以降のバージョンでは、ディレクトリのサポートを追加する必要があったため、\ を使用することを選択しました。これは、/ が既にオペレーティング システムで別の意味を持っていたためです。
現代のオペレーティング システムには、コンピュータの歴史の多くの成果物があり、ほとんどの人は気付いていないと思いますが、それでもオペレーティング システムの動作に大きな影響を与えています。
それで、正しい方法は何ですか?Microsoft がディレクトリ サポートを DOS に実装する前に、UNIX ライクなオペレーティング システムが存在していたので、あるとすれば / だと思います。
補足として、.NET について話すときはSystem.IO.Path.DirectorySeparatorChar
、現在のパス セパレータを取得するために使用する必要があります。
ファイル システムのパス セパレータに関する限り、Windows ではすべてのAPI がスラッシュを受け入れると思います (ただし、おそらくバグのあるものでは受け入れないものもあります)。問題は、ほとんどのアプリケーションがスラッシュを受け入れない (または正しく解析しない) ことです。 )。
実際、私の記憶が正しければ、MS-DOS でさえ、サブディレクトリのサポートを開始して以来 (v2.0)、API レベルで「/」をパス区切り文字として受け入れていましたが、その時までに「/」文字は既に次のように確立されていました。コマンド ライン オプションの「スイッチ」文字。バックスラッシュが DOS (およびそれ以降の Windows) での事実上のパス区切り文字になりました。
URI はファイル パスと似ていますが異なる動物であり、URI は常に「/」を使用してコンポーネントを区切る必要があります。Windows アプリケーションと API はおそらく '\' を URI の区切り文字として受け入れます。これはおそらく、これらのシステムでバックスラッシュを区切り文字として使用することに慣れているためであり、URI を使用してローカル ファイルを表すこともできるためです。
今日の役に立たない雑学 - MS-DOS の初期のバージョンには、コマンド ライン オプション スイッチ文字 (通常は「/」から「-」) を変更する API があったため、コマンドはより Unix に似たものになり、コマンドはコマンドラインでパスセパレータとして「/」を受け入れます。この API は成功とは言えず (アプリケーションで広くサポートされていなかったためだと思います)、後のバージョンでは削除されました。
うーん... 2番目の読書では、この全体の答えはほとんど役に立たないトリビアです。
Web は、パス内のディレクトリをスラッシュ (/) で区切る UNIX の方法に基づいています。Windows ではディレクトリをバックスラッシュ (\) で区切ります
正しい方法は、その用途によって異なります。Windows マシン上のローカル ファイルへのパスには、バックスラッシュを使用します。UNIX ベースのマシン (Mac、Linux を含む) にある Web リソースまたはファイルへのパスには、スラッシュを使用します。
.NET の URI がスラッシュを使用する理由は、Web ブラウザーで使用するためのフォーマットであるためです。
サーバーは、Web リソースをハード ドライブ上のファイルにリンクするために必要なすべての作業を行います。
Windows では\
、ファイル システムの区切り記号としてバックスラッシュ ( ) を使用します。それ以外の場合はすべて、スラッシュが使用されます ( /
)。Uri
型はスラッシュを使用します。これは、ユニフォームリソース識別子が定義されているためです。
\ バックスラッシュは危険です。常にエスケープすることに注意する必要があります。多くのプログラミング言語には、エスケープにバックスラッシュを使用する同等の printf があります。
/ Frontslash はほとんど無害です。
: コロンは Apple によって使用されていました (現在もある程度使用されています)。
また、他の回答に追加するために、パスを作成する必要がある場合は、Windows または Linux に基づいてパスを形成するためにバックスラッシュまたはスラッシュを使用しないでください。
これを行う最善の方法は、 を使用することPath.Combine
です。
これがドキュメントです。