ファイルパスの\
と/
の違いについて疑問に思いました。パスに/
が含まれていることがあり、\
が含まれていることがあります。
誰がいつ\
と/
を使うべきか説明できれば素晴らしいでしょう。
/
は、UnixおよびUnix系システムでのパス区切り文字です。最近のWindowsでは、一般的にファイルパスに\
と/
の両方を互換的に使用できますが、Microsoftは何十年もの間、\
をパス区切り文字として使用することを推奨しています。
これは、1970年代にまでさかのぼる歴史的な理由から行われており、10年以上前にWindowsが登場しています。当初、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は、DOSとは無関係の OS/2 というオペレーティングシステムで共同作業を行いました。 OS/2は、おそらくより多くのUnix開発者を引き付けるために、両方の区切り文字を使用することができました。 MicrosoftとIBMは1990年に別れを迎えました 、Microsoftは自分が持っていたコードを入手して作成しました Windows NT 。これにはWindowsのすべての最新バージョンが基づいています。 。
下位互換性は、彼らが引き受けてきたすべての主要なOS移行(DOSからWin16/DOSへ、Win16/Win32へ、Win32/WinNTへ)からMicrosoftにとってのゲームの名前であったので、この特殊性は動けなくなるでしょう。まだしばらく存在します。
この矛盾が存在するのはこのためです。私が言ったように、WinAPIは一般的にそれらを互換的に使用することができるので、それはあなたがしていることに実際には効果がないはずです。ただし、ディレクトリ名の間に/
が必要なときに\
を渡すと、サードパーティのアプリケーションはおそらく壊れるでしょう。 Windowsを使用している場合は、\
を使用してください。もしあなたがUnixか URI s(それらはUnixパスの基礎を持っていますが、それは全く別の話です)を使っているなら、/
を使ってください。
C#の文脈では、これはis技術的にはC#の質問です。 UnixとWindowsの両方で動作する、より "移植性のある" C#コード(C#が主にWindows言語であっても)では、Path.DirectorySeparatorChar
フィールドを使用してコードでそのシステムで優先セパレーターを使用し、Path.Combine()
を使用してパスを正しく追加できます。 。
MS-DOS 1. CP/Mからの '/'のコマンドラインオプション(またはスイッチ)文字の表記法を保持しました。当時、ファイルシステムにディレクトリ構造はなく、競合もありませんでした。
MicrosoftがMS-DOS(およびPC-DOS)2.0を使用してよりUnix的な環境を開発した場合、既存のコマンドラインオプションと競合しないものを使用してパス区切り文字を表す必要がありました。内部的には、システムは '/'または '\'のどちらでも同じように機能します。コマンドプロセッサ(および多くのアプリケーション)は、スイッチ文字として '/'を使い続けました。
UNIXの互換性を向上させるために、 CONFIG.SYS
entry SWITCHAR=-
をデフォルトの/
に優先させるために使用できます。これにより、組み込みコマンドと標準ユーティリティは代替文字を使用します。 UNIXのパス区切り文字は、ファイル名とディレクトリ名に明確に使用できます。このエントリはそれ以降のバージョンで削除されました、しかしDOS呼び出しはブートの後に値を設定するために文書化されました。
これはほとんど使用されておらず、ほとんどのサードパーティ製ツールは変更されていません。混乱は続く。 Unixツールの多くのポートは ' - 'スイッチ文字を保持していますが、両方の規約をサポートしているものもあります。
後続のPowerShellコマンドプロセッサは、厳密なエスケープおよびスイッチパラメータを実装しており、従来のツールが使用されている場合を除いて、混乱を大幅に回避します。
質問も回答もC#に関するものではありません。
Unixベースのシステムでは、\
はエスケープ文字です。つまり、\
はパーサーに、これはスペースでありステートメントの終わりではないことを伝えます。 Unixシステムでは/
はディレクトリセパレータです。
Windowsでは\
はディレクトリ区切り文字ですが、/
はファイル名またはディレクトリ名には使用できません。
\
はWindowsのファイルパスでは正しく、/
はURIで正しいです。This は適切なリソースになることができます。
与えられた答えとは別に、\
は、プログラミング言語、テキストエディタ、および字句解析を適用する一般的なシステムで特殊文字(\n
\t
など)に広く使用されていることを言及する価値があります。
あなたが例えばプログラミングしているなら、それを適切に使うために他のもの(\\
)でバックスラッシュをエスケープする必要があることさえ - あるいはC#@"\test"
のようなエスケープ文字列を使わなければならない - .
もちろん、前述のように、Web URIは標準でスラッシュを使用します。 しかし、両方のスラッシュは最新かつ最も一般的なコマンドラインツールで動作します。。
更新:少し検索した後、/
と\
の間の全体的な話は、その頃のDOSとUnixベースのシステムの時代の「コンピューターの歴史」に遡ります。 HowToGeekはこの話について興味深い 記事 を持っています。
一言で言えば、DOS 1.0は最初にIBMによってディレクトリサポートなしでリリースされ、/
は別の( "切り替え")コマンド機能のために使われました。ディレクトリが2.0バージョンで導入されたとき、/
はすでに使用されていたので、IBMは視覚的に最も近いシンボルである\
を選択しました。一方、Unixでは標準的にディレクトリに/
を使用していました。
ユーザーがさまざまなシステムを使い始めると混乱し始め、どちらの場合もOS開発者はシステムを動作させようと試みました。ブラウザによってはhttpをサポートしているため、URLの部分でも同じです。 :\\ www.test.com\go形式。これは一般的には欠点を持っていましたが、今日では、DOS上ではなくても、Windows上で両方のスラッシュをサポートしようとすることで、後方互換性の原因が現在も残っています。
C#でもどちらも使用しないでください。あなたは常に Path
class を使うべきです。これにはPath.Combine
という名前のメソッドが含まれています。これを使用して、区切り文字を自分で指定しなくてもパスを作成できます。
使用例
string fullPath = System.IO.Path.Combine("C:", "Folder1", "Folder2", "file.txt");
\
は、Windowsのローカルファイルパスとネットワークパスに使用されます。
C:\Windows\Temp\
または\\NetworkSharedDisk\Documents\Archive\
/
は、次のように標準のURIに必要なものです。