22

tl;dr: システムの現在のディレクトリ区切り文字を Windows に問い合わせるにはどうすればよいですか?


Windows のバージョンが異なれば、動作も異なるようです (たとえば\/どちらも英語版で動作し、\ は明らかに日本語版で、₩ は明らかに韓国語版で、など...

これをハードコーディングするのを避け、代わりに実行時に Windows に問い合わせる方法はありますか?

ノート:

理想的には、ソリューションは のような高レベルの DLL に依存すべきではありませんShlWAPI.dll。低レベルのライブラリもこれに依存しているためです。kernel32.dllしたがって、実際には、またはそのようなものに依存する必要がntdll.dllあります...ただし、高レベルであろうと低レベルであろうと、何も見つけるのに苦労しています。

編集:

ちょっとした実験の結果、カーネルではなく、スラッシュをバックスラッシュに変換するのは Win32 サブシステム (つまり... または、kernel32.dllおそらく? わからない、テストしていない...) であることがわかりました。(接頭辞を付けると、パスの後半でスラッシュを使用できなくなります。また、NT ネイティブ ユーザー モード API もスラッシュで失敗します。)RtlDosPathNameToNtPathName_Untdll.dll\\?\

どうやらそれはWindowsに完全に「組み込まれている」のではなく、単なる互換性機能です。つまり、バックスラッシュの代わりに盲目的にスラッシュを置き換えることはできません\\?\

これに関してどのような結論を下すべきかについて複雑な感情を抱いていますが、私はそれについて言及したいと思いました.

(これを「パスセパレーター」とタグ付けしましたが、これは技術的には正しくありません。パスセパレーターは、ディレクトリではなくパスを分離するために使用されるためです( ;vs. \)。

4

3 に答える 3

35
于 2011-09-06T03:42:01.583 に答える
4

元のポスターは、他の誰かの回答へのコメントに「カーネルモード」というフレーズを追加しました。

元の質問がカーネルモードについて尋ねることを意図していた場合、パス区切り文字である/に依存することはおそらく良い考えではありません。ファイルシステムが異なれば、ディスク上で異なる文字セットを使用できます。Windowsのファイルシステムドライバが異なれば、異なる文字セットも許可される可能性があります。通常、基になるファイルシステムがディスク上で受け入れない文字を含めることはできませんが、動作がおかしくなる場合があります。たとえば、Posixモードでは、NTFSは通常これらの文字を許可していませんが、コンポーネント名にNTFSパーティションのパス名にいくつかの文字を含めることができます。(しかし、明らかに/ Posixでは/はそれらの1つではありません。)

Unicodeのカーネルモードでは、U + 005Cは常に円記号であり、常にパス区切り文字です。円とウォンのUnicodeコードポイントはU+005Cではなく、パス区切り文字でもありません。

ANSIのカーネルモードでは、どのANSIコードページに応じて問題が発生します。ASCIIに十分に類似しているコードページでは、0x5Cは円記号であり、パス区切り文字です。ANSIコードページ932および949では、0x5Cは円記号ではありませんが、発生場所によっては0x5Cがパス区切り文字になる場合があります。0x5Cがマルチバイト文字の最初のバイトである場合、それは円記号またはウォン記号であり、パス区切り文字です。0x5Cがマルチバイト文字の2番目のバイトである場合、それ自体は文字ではないため、円記号やウォン記号ではなく、パス区切り文字でもありません。特定の文字が実際に文字全体であるかどうかを判断するには、文字列の先頭から解析を開始する必要があります。また、中国語とUTF-8では、マルチバイト文字は2文字より長くなる可能性があります。

于 2011-09-06T05:20:55.100 に答える
2

標準のスラッシュ ( /) は、DOS および Windows のすべてのバージョンで常に機能します。これを使用すると、Windows の日本語版と韓国語版でバックスラッシュがどのように表示されるかについて心配する必要はありません。マック)。どこでもスラッシュを使用してください。

于 2011-09-06T04:25:41.087 に答える