2016-09-08 5 views
1

背景:中国語などの国際文化のドライブレターをプログラムで検証する(C#)にはどうすればよいですか?

実際には存在しない可能性のあるパスを検証しようとしています。だから、 "Directory.Exists()"メソッドを使って検証することはできません。また、コードは別のマシンで実行される可能性があります。有効なものと無効なものを知りたいだけです。私は研究して、これは私が想像していたよりもはるかに複雑であることを発見しました。マイクロソフトがこのための方法を与えていれば、はるかに単純だったでしょう。

すぐに、Path.GetInvalidPathChars()やPath.GetInvalidFileNameChars()などのメソッドの値が非常に限られていることに気付きました。 GetInvalidPathChars()を使用して検証すると、 "*"や "?"などの文字が許可されますが、実際にはディレクトリ名やファイル名としては有効ではありません。 GetInvalidFileNameChars()がより良いオプションです。しかし、コロン( ':')は使用できません。これは実際にはドライブ文字の直後にある場合にのみ有効な文字です。さらに、フォルダ名にすべての文字をドット( '。')で表すことはできないという規則がいくつかあります。同様に、ディレクトリにはLPT1〜LPT9やCOM1〜COM9などの予約語を使用できません。ここで文書化されたルールの完全なリストは、次のとおりです。https://msdn.microsoft.com/en-us/library/aa365247.aspx?f=255&MSPPError=-2147217396

をので、パスを検証するために、私は2つの部分にパスを分割しています -

  • Path.GetPathRoot()メソッドを使用して、ルートの一部と別途
  • をその検証します
  • 残りのパス - これはさらにPath.DirectorySeparatorCharを使用して分割され、次に複雑なアルゴリズムを使用して各ディレクトリ名を個別に検証します。 (完了したら、後でそのコードを投稿します)。

主な質問

私は、ドライブ文字が有効であることを確認することで、ルートパスを検証します。私はあなたがA:からZ:へのドライブだけを持つことができることを知っています。しかし、中国語や日本語などの国際文化のために、それをどのように検証できますか?私はドイツ語や中国語の機械のための有効なドライブレターのリストのためのドキュメントを見つけることができませんでした。これらのシステムでは、他のUnicode文字をドライブ文字として使用できますか?

+0

文化不変性を使用して文字列を検索しようとしましたか?私は前にヘブライ語とアラビア語のテキストでいくつかのRegex'ing、IIRCは私のために働いています。 – Meloviz

+0

ファイルシステムに質問してみませんか?つまり、何かを事前に検証しようとしないでください。そのままパスを使用してください。 I/O APIは、入力が間違っていることを知らせます。とにかく、あなたはすでにあなたの主要な質問に対する答えを知っています。ドライブレターは、DOSから持ち越されたアーティファクトです。 DOSはUnicodeに先立つ。 (ドライブレターを使用せずにボリュームを参照することができます) – IInspectable

答えて

1

シンプルです:文化が何であるにせよ、有効なドライブ文字はA-Zだけです。 もちろん、ドライブ文字のないパスを使用することもできます。

一般的に、パス名を扱うときに文化について心配する必要はありません。フォルダーはUnicodeを使用し、ロケールに関係なくすべてのユーザーがアクセスできます。

しかし、解決すべき他の非常に大きな問題がたくさんあります。

私は言うでしょう:これは不可能です。 なぜStackoverflowの答えのための多くの完全な説明です。 しかし、これについて考えてみましょう。ドライブレターにマップされたネットワーク共有を持っている可能性があります。これは、Sambaと共有されているLinuxまたはMacフォルダです。だからあなたは、それらのOSのすべての制限、そのマシン上の正確なファイルシステム、および共有プロトコルの制限を常に懸念しなければなりません。 WindowsマシンがFAT32ファイルシステムを共有していると思ってください。あるいは、Unicodeや長いファイル名もサポートしていないFAT16のものさえあります。

ローカルドライブであっても、他にも多くの問題があります。 しかし、私が言ったように、この答えにはあまりにも多くの。

+0

ありがとうございます。ドライブレターに関する私の主な質問に答えました。限り、 "\\ ServerName \ ShareName \ folder"のようなドライブ文字のないパス - 私は別にそれを検証します。私の前提は非常に単純です - ネットワーク上のサーバーのOSは関係ありません。私のアプリケーションはWindows上でのみ動作し、どのパスも常にMicrosoftがパスとして許可する形式で表示されます。 Microsoft以外のプラットフォームや隠しドライブに対する追加の制限についてはあまり心配していません。なぜなら、検証では1%の制限がサポートされていないとしても、通常の要件であるためです。 – Abhay

+0

"任意のパスは常にMicrosoftがパスとして許可する形式で表示されます":true。しかし、下層技術は、ウィンドウができるもののサブセットのみをサポートするかもしれない。純粋なWindowsの場合でも、ローカルディスクがFAT16(極端な場合)の場合、Unicodeはサポートされません。したがって、あなたのコードでは、ギリシャ語の文字列が有効であると言えるかもしれませんが、ファイルシステムでは許可されません。だから失敗する。エッジケース、真。しかし、限界が何であるかはいつも分かります。例えば、 "NTFS、ローカルディスクのみ"(ただし、そこにもいくつかのトラップがあります):-) –

関連する問題