私は違いに疑問を抱いた\
と/
ファイルパスインチ パスが含まれ/
ていることもあれば、パスが含まれていることもあります\
。
誰でも使用する際に説明できる場合、それは素晴らしいことだ\
と/
。
私は違いに疑問を抱いた\
と/
ファイルパスインチ パスが含まれ/
ていることもあれば、パスが含まれていることもあります\
。
誰でも使用する際に説明できる場合、それは素晴らしいことだ\
と/
。
回答:
/
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()
し、パスを適切に追加できます。
Path.Combine
。
foo.exe /bar
コマンドラインスイッチfoo.exe \bar
として解釈される可能性がありますが、たとえば、現在の「ドライブ」のbar
ルートディレクトリにあるファイル/フォルダと呼ばれるものとして解釈される可能性があります。\
C:\
/
to からの正規化\
はWin32互換層で行われることに注意してください。つまり、それを回避すると違いが生じます。この最もよく知られている例は、拡張パスです\\?\C:\
。NTFSでは期待どおりに機能しますが、機能し\\?\C:/
ません。
/
と` is not entirely true. For network path you have to use
`を処理できます(たとえば、\\ <servername>ボットは// <servername>ではありません)
MS-DOS 1.0は、CP / Mからの '/'のコマンドラインオプション(またはスイッチ)文字規則を保持していました。当時、ファイルシステムにはディレクトリ構造がなく、競合もありませんでした。
MicrosoftがMS-DOS(およびPC-DOS)2.0でよりUnixに似た環境を開発したとき、既存のコマンドラインオプションと競合しないものを使用してパス区切り文字を表す必要がありました。内部的には、システムは「/」または「\」のどちらでも同様に機能します。コマンドプロセッサ(および多くのアプリケーション)は、引き続き '/'をスイッチ文字として使用しました。
CONFIG.SYS
エントリがSWITCHAR=-
上書きするために使用することができ/
Unixの互換性を改善するために、デフォルトを。これにより、組み込みコマンドと標準ユーティリティで代替文字が使用されます。Unixパス区切り文字は、ファイル名とディレクトリ名に明確に使用できます。このエントリはそれ以降のバージョンでは削除されましたが、起動後に値を設定するためのDOSコールが文書化されていました。
これはほとんど使用されておらず、ほとんどのサードパーティツールは変更されていません。混乱は続いています。Unixツールの多くのポートは「-」スイッチ文字を保持していますが、一部は両方の規則をサポートしています。
後続のPowerShellコマンドプロセッサは、厳密なエスケープとスイッチパラメータを実装し、レガシーツールが使用されている場合を除いて、混乱を大幅に回避します。
質問も回答もC#とは関係ありません。
/
RSTS(1970)やRSX(1972)などのさまざまなPDP-11オペレーティングシステムでのオプションイントロデューサとしての使用は、CP / M(1973)での使用に先行しています。
Unixベースのシステムで\
は、エスケープ文字です。つまり\
、これはスペースであり、ステートメントの終わりではないことをパーサーに伝えます。Unixシステムで/
は、ディレクトリ区切り文字です。
Windowsでは\
ディレクトリ区切り文字ですが、/
ファイル名またはディレクトリ名には使用できません。
\
また/
、DOSにはUnixユーザーが慣れているのと同じ複雑なパーサーがなかったため、ファイル名には(他のいくつかの記号も)使用できません。優れたパーサーの欠如は、MS-DOSがQDOS( "Quick and Dirty Operating System")から派生した結果です。限られたハードウェアですばやく実行できるようにするためのものです。もちろん、これらすべては、下位互換性のために現在も存在しています。
/
は「Alternate_Directory_Separator」として追加されたことに言及する価値があります
\
Windowsファイルパスで/
正しく、URIで正しい。これは関連するリソースになる可能性があります。
\
は/
自動的に変換されます。私の本では、これは「シームレスに機能する」と呼ばれています。
与えられた回答とは別に、プログラミング言語、テキストエディター、字句解析を適用する一般的なシステムの\
特殊文字(など\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では両方のスラッシュをサポートする試みが行われているため、今日でも全体が下位互換性の原因になっています。
` as well as many
make`シェルを使用するときにかなり怒っているので不正解です...最近のWindowsがデフォルトのALTERNATE_PATH_SEPARATOR環境変数を定義している/
ため、Windowsはおそらく両方を受け入れることができます。
/
は、システムのあらゆる場所でパスをサポートすることが含まれます。もちろん、アプリケーションは余暇にそれらのパスを誤解する可能性があるため、あまり使用されませんでした。パスの独自の(壊れた)検証を行わなかった非CLIアプリケーションは、最初から問題なく動作しました。
C#ではどちらも使用しないでください。常にPath
クラスを使用する必要があります。これにはPath.Combine
、セパレーターを自分で指定せずにパスを作成するために使用できるというメソッドが含まれています。
使用例:
string fullPath = System.IO.Path.Combine("C:", "Folder1", "Folder2", "file.txt");
\
次のように、Windowsローカルファイルパスとネットワークパスに使用されます。
C:\Windows\Temp\
または \\NetworkSharedDisk\Documents\Archive\
/
次のように、標準URIに必要なものです。
/
はパスでも認識します(少なくとも7つは認識します)。
/
は答えで述べたように、標準のURIでの使用を説明するために、stackoverflowページまたは任意のWebサイトのハイパーリンクにリンクするつもりでした。