ファイルパスのスラッシュ(/)とバックスラッシュ(\)の違い


153

私は違いに疑問を抱いた\/ファイルパスインチ パスが含まれ/ていることもあれば、パスが含まれていることもあります\

誰でも使用する際に説明できる場合、それは素晴らしいことだ\/


4
どのようなコンテキストの違い?Webbyコンテキスト?C#文字列でエスケープする?ASP.NETでタグ付けされています。
Peter Mortensen


6
@ピーターこれはより良い答えを持っているので、私はこれのだましとして古いものを閉じます。
nicael

6
C#asp.netは質問とどのように関連していますか?
Oriol

2
@zzzzBovなぜこれは単に古いものにリダイレクトされなかったのですか?私が尋ねた質問が、後に起こった何かの「複製」として遠い将来に閉じられる可能性のあるシステムは好きではありません。少なくとも、複製ではなく「置き換えられた」など、より説明的なものと呼びます。元の「1」は何も複製することはできません。それが唯一のものです。

回答:


248

/UnixおよびUnixライクなシステムのパス区切り文字です。最近のWindowsは一般に両方\を使用でき/、ファイルパスに互換性がありますが、Microsoftは\何十年もの間、パス区切り文字としてを使用することを提唱しています。

これは、1970年代にさかのぼるWindowsが10年以上前にさかのぼる歴史的な理由で行われます。当初、MS-DOS(初期のWindowsの基礎)はディレクトリをサポートしていませんでした。Unixは/最初からこの文字を使用してディレクトリをサポートしていました。ただし、MS-DOS 2.0でディレクトリが追加されたとき、MicrosoftとIBMはすでにコマンドスイッチ/文字を使用しており、DOSの軽量パーサー(QDOSから派生し、ローエンドのハードウェアで実行するように設計されている)のため、それらを見つけることができませんでした。既存のアプリケーションとの互換性を損なうことなくキャラクターを使用する実行可能な方法。/

したがって、次のようなコマンドの引数としてファイルパスを渡すときに、「スイッチがない」または「無効なスイッチ」に関するエラーを回避するには:

cd/                        <---- no switch specified
dir folder1/folder2        <---- /folder2 is not a switch for dir

\代わりにキャラクターが使用されることが決定されたため、次のようなコマンドを記述できます

cd\
dir folder1\folder2

エラーなし。

その後、MicrosoftとIBMは、OS / 2と呼ばれるDOSとは無関係のオペレーティングシステムで共同作業を行いました。OS / 2には、おそらくより多くのUnix開発者を引き付けるために、両方のセパレータを使用する機能がありました。MicrosoftとIBMが1990年別れたとき、Microsoftは彼らが持っていたコードを取り、すべての最新バージョンのWindowsのベースとなっているWindows NTを作成しました。


下位互換性は、Microsoftが行ったすべての主要なOS移行(DOSからWin16 / DOS、Win16 / Win32、Win32 / WinNT)からのゲームの名前であるので、この特殊性は行き詰まり、おそらくまだしばらく存在します。

このため、この矛盾が存在します。私が言ったように、WinAPIは一般的にそれらを交換可能に使用できるので、それはあなたがしていることに本当に何の影響もないはずです。ただし、サードパーティのアプリケーションは/\betweenディレクトリ名を期待するときにaを渡すと、おそらく壊れます。Windowsを使用している場合は、\。UnixまたはURIを使用している場合(Unixパスに基盤がありますが、まったく別の話です)、を使用してください/


C#のコンテキストでは、これ技術的にはC#の質問なので、UnixとWindowsの両方で機能する「移植性の高い」C#コードを記述したい場合(C#が主にWindows言語であっても)、Path.DirectorySeparatorCharフィールドでフィールドを使用すると、コードでそのシステムの優先セパレーターを使用Path.Combine()し、パスを適切に追加できます。


57
そして、常にを使用してパスを結合しますPath.Combine
チェンチェン

1
面白い。したがって、DOSまたはWindowsでは、foo.exe /barコマンドラインスイッチfoo.exe \barとして解釈される可能性がありますが、たとえば、現在の「ドライブ」のbarルートディレクトリにあるファイル/フォルダと呼ばれるものとして解釈される可能性があります。\C:\
Jeppe Stig Nielsen

4
この/to からの正規化\ はWin32互換層で行われることに注意してください。つまり、それを回避すると違いが生じます。この最もよく知られている例は、拡張パスです\\?\C:\ 。NTFSでは期待どおりに機能しますが、機能し\\?\C:/ません。
Voo 2016

4
@PC Luddite:そのWinAPIは、両方/` is not entirely true. For network path you have to use `を処理できます(たとえば、\\ <servername>ボットは// <servername>ではありません)
raznagul

2
@raznagulはい。私は答えでネットワークパスについて実際に言及しませんでした。私は主に一般的なファイルパスタイプを使い続けました。追加します。
PC Luddite 2016

20

MS-DOS 1.0は、CP / Mからの '/'のコマンドラインオプション(またはスイッチ)文字規則を保持していました。当時、ファイルシステムにはディレクトリ構造がなく、競合もありませんでした。

MicrosoftがMS-DOS(およびPC-DOS)2.0でよりUnixに似た環境を開発したとき、既存のコマンドラインオプションと競合しないものを使用してパス区切り文字を表す必要がありました。内部的には、システムは「/」または「\」のどちらでも同様に機能します。コマンドプロセッサ(および多くのアプリケーション)は、引き続き '/'をスイッチ文字として使用しました。

CONFIG.SYSエントリがSWITCHAR=-上書きするために使用することができ/Unixの互換性を改善するために、デフォルトを。これにより、組み込みコマンドと標準ユーティリティで代替文字が使用されます。Unixパス区切り文字は、ファイル名とディレクトリ名に明確に使用できます。このエントリはそれ以降のバージョンでは削除されましたが、起動後に値を設定するためのDOSコールが文書化されていました。

これはほとんど使用されておらず、ほとんどのサードパーティツールは変更されていません。混乱は続いています。Unixツールの多くのポートは「-」スイッチ文字を保持していますが、一部は両方の規則をサポートしています。

後続のPowerShellコマンドプロセッサは、厳密なエスケープとスイッチパラメータを実装し、レガシーツールが使用されている場合を除いて、混乱を大幅に回避します。

質問も回答もC#とは関係ありません。


2
歴史的な注記として、/RSTS(1970)やRSX(1972)などのさまざまなPDP-11オペレーティングシステムでのオプションイントロデューサとしての使用は、CP / M(1973)での使用に先行しています。
PJTraill 2016

9

Unixベースのシステムで\は、エスケープ文字です。つまり\、これはスペースであり、ステートメントの終わりではないことをパーサーに伝えます。Unixシステムで/は、ディレクトリ区切り文字です。

Windowsでは\ディレクトリ区切り文字ですが、/ファイル名またはディレクトリ名には使用できません。


1
\ また/、DOSにはUnixユーザーが慣れているのと同じ複雑なパーサーがなかったため、ファイル名には(他のいくつかの記号も)使用できません。優れたパーサーの欠如は、MS-DOSがQDOS( "Quick and Dirty Operating System")から派生した結果です。限られたハードウェアですばやく実行できるようにするためのものです。もちろん、これらすべては、下位互換性のために現在も存在しています。
PC Luddite 2016

2
それは、後のWindowsバージョンで/は「Alternate_Directory_Separator」として追加されたことに言及する価値があります
Tomer W

@PCLuddite多分私たちは代わりに前方互換性を考えるべきですか?

1
@nocomprendeファイルパスは非互換ですか?何と互換性がない?そして、前に述べたように、「少数のDOSアプリ」(実際には数千に上る)を破壊から救うことは、当時の消費者にとって非常に重要でした。それがMicrosoftを今日成功させた理由であり、Unix(および他のすべてのもの)は衰退し始めています(過去10年間で復活があったとしても)。それが常識で見られていないか私は見落としている。
PC Luddite

1
@nocomprendeそして、標準化されていないファイルパスについてのあなたの議論は完全に無効です。それらはWindowsで標準化されており、Unixで標準化されています。クロスプラットフォーム標準について話している場合、それは実際にはそれほど便利でも実装も簡単ではありません。ある規格が別の規格よりも本当に「優れている」と誰が言っているのでしょうか。
PC Luddite

8
  • RFC 1738で標準化されたURLでは、プラットフォームに関係なく、常にスラッシュを使用します。
  • ファイルパスとURIが異なります。\Windowsファイルパスで/正しく、URIで正しい。
  • 一部のブラウザ(FirefoxとOpera)は、バックスラッシュのあるURIに遭遇すると致命的な障害を起こします。
  • System.IO.Path.DirectorySeparatorCharは、現在のパス区切り文字を取得します

これは関連するリソースになる可能性があります。


10
破滅的な失敗?Firefox \​​/自動的に変換されます。私の本では、これは「シームレスに機能する」と呼ばれています。
Kroltan

22
前回Firefoxで\を使用したときに家が火事になりました
-user3163495

1
@ CarstenS、FirefoxはURLのバックスラッシュをスラッシュに自動的に変換せず、リンクを開きません。このアドオンは、バックスラッシュでURLを修正し、ページを開きます。addons.mozilla.org/en-US/seamonkey/addon/...
サミ

「破局的な失敗」とはどういう意味ですか?何が起こるのですか?ブラウザはクラッシュして終了しますか?
Peter Mortensen 2016

7

与えられた回答とは別に、プログラミング言語、テキストエディター、字句解析を適用する一般的なシステムの\特殊文字(など\n \t)に広く使用されていることは言及に値します。

たとえばプログラミングをしている場合、バックスラッシュを\\適切に使用するためにバックスラッシュ()でエスケープする必要がある、またはC#などのエスケープ文字列を使用する必要がある場合があります@"\test"

もちろん、前述のように、Web URIでは標準でスラッシュを使用します しかし、両方のスラッシュは、最新の最も一般的なコマンドラインツールで機能します

更新:少し検索したところ、当時のDOSとUnixベースのシステムの時代には、「コンピュータの歴史」/との間のすべての話が\明らかになります。HowToGeekには、このストーリーに関する興味深い記事があります。

簡単に言うと、DOS 1.0は当初IBMによってディレクトリサポートなしでリリースさ/れ、別の(「切り替え」)コマンド機能に使用されていました。ディレクトリが2.0バージョンで導入されたとき、/すでに使用されていたため、IBMは視覚的に最も近いシンボルであるを選択しました\。一方、Unixは標準的/にディレクトリに使用されます。

ユーザーが多くの異なるシステムを使い始めると混乱し始め、OS開発者は両方のケースでシステムを機能させようとしました。これは一部のブラウザーがhttp:\\ www.testをサポートしているため、URLの一部にも当てはまります。 com \ go形式。これには一般的に欠点がありますが、DOSに基づいていなくても、Windowsでは両方のスラッシュをサポートする試みが行われているため、今日でも全体が下位互換性の原因になっています。


「両方のスラッシュはファイルシステムパスで機能します。」Unixは` as well as many make`シェルを使用するときにかなり怒っているので不正解です...最近のWindowsがデフォルトのALTERNATE_PATH_SEPARATOR環境変数を定義している/ため、Windowsはおそらく両方を受け入れることができます。
Tomer W '18 / 07/18

1
@TomerW Windows NTは常にPOSIX互換でした(初期のPOSIXはとにかくごちゃごちゃで、下位互換性のために一部はWindowsに固定されていましたが)。これに/は、システムのあらゆる場所でパスをサポートすることが含まれます。もちろん、アプリケーションは余暇にそれらのパスを誤解する可能性があるため、あまり使用されませんでした。パスの独自の(壊れた)検証を行わなかった非CLIアプリケーションは、最初から問題なく動作しました。
Luaan

@Luaan Windowsには多くのPOSIX機能をサポートする機能がありましたが、「POSIX互換」であるとは言えません。確かに、長年にわたって使用できるいくつかのPOSIXサブシステムがありましたが、それらは理想からほど遠いものでした。Windows 10は、Ubuntuに付属するLinuxツールのネイティブサポートとともに、今年の夏の後半にUbuntu bashをサポートする予定です。そのため、将来的にはそれを主張できるかもしれませんが、「常に」とは言えません。
PC Luddite

@Luaan「互換性」がない限り、「cygwinの動作」を意味します。
PC Luddite

@PCLudditeいいえ、100%POSIX.1c互換でした。すべてのUNIXアプリケーションが動作するという意味ではありません。ほとんどのUNIXアプリケーションはPOSIXに準拠していません :)
Luaan

6

C#ではどちらも使用しないでください。常にPathクラスを使用する必要があります。これにはPath.Combine、セパレーターを自分で指定せずにパスを作成するために使用できるというメソッドが含まれています。

使用例:

string fullPath = System.IO.Path.Combine("C:", "Folder1", "Folder2", "file.txt");

5

\ 次のように、Windowsローカルファイルパスとネットワークパスに使用されます。

C:\Windows\Temp\ または \\NetworkSharedDisk\Documents\Archive\

/ 次のように、標準URIに必要なものです。

http://www.stackoverflow.com/


2
@NikhilVartak、私は例を追加しましたが、私の最初の答えはOPのすべての質問に対応していると思いました。
アッシュ

3
Windows /はパスでも認識します(少なくとも7つは認識します)。
ケネスK.

この答えは完全ではありません。
reinierpost

Stack Overflowのメインページだけでなく、いくつかのリソースにリンクするつもりでしたか?
Tas

@reinierpost、私の答えはOPの質問と関連するタグに基づいています。ここでの他のいくつかの回答と同様に、stackoverflow.com / questions / 1589930 / …から何かをコピーしてここに貼り付けることができますが、それは過剰に見えました。@tas、私/は答えで述べたように、標準のURIでの使用を説明するために、stackoverflowページまたは任意のWebサイトのハイパーリンクにリンクするつもりでした。
Ash
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.