背景:中国語などの国際文化のドライブレターをプログラムで検証する(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文字をドライブ文字として使用できますか?
文化不変性を使用して文字列を検索しようとしましたか?私は前にヘブライ語とアラビア語のテキストでいくつかのRegex'ing、IIRCは私のために働いています。 – Meloviz
ファイルシステムに質問してみませんか?つまり、何かを事前に検証しようとしないでください。そのままパスを使用してください。 I/O APIは、入力が間違っていることを知らせます。とにかく、あなたはすでにあなたの主要な質問に対する答えを知っています。ドライブレターは、DOSから持ち越されたアーティファクトです。 DOSはUnicodeに先立つ。 (ドライブレターを使用せずにボリュームを参照することができます) – IInspectable