2009-06-20 11 views
7

は、私は、ユーザーが彼が望んでいる任意のユーザー名を選択することができていますし、それが今、私は彼のためにディレクトリを作成する必要がありますこのようなすべての ファイルシステムのファイル名のエスケープ? C#

AC♀¿!$"Man'@ 

ように何かをすることができます。どのような関数私はFSの問題/例外をしないようにテキストをエスケープするために使用?

答えて

3

Path.GetInvalidFileNameCharsまたはPath.GetInvalidPathCharsを使用して、削除する文字を確認してください。

http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidfilenamechars.aspx

+0

ディレクトリが既に存在するかどうかを確認してください(重複する「ユーザー名」を確認してください)。 – schnaader

+1

これは役に立たない。私は無損失のエスケープが必要です。文字を削除すると損失があり、2つの異なる名前の文字が削除された後に衝突する可能性があります。 –

+4

GetInvalidPathChars()は無効な文字を返しますが、必ずしも無効な文字をすべて返すわけではありません。引用: "このメソッドから返された配列は、ファイル名とディレクトリ名で無効な文字の完全なセットを含むことは保証されていません。" – Bevan

1

私はあなたの最善の策は、有効な置換文字列に無効なファイルシステムの文字をマップする辞書を作成することだと思います。その後、無効な文字列をスキャンし、有効な文字列で置き換えます。これにより、ユーザーは必要なものを選択し、必要に応じてユーザーの名前に変換し直すことができます。

+0

しかし、その後にどの文字が置き換えられたのかを伝える必要があることに注意してください。 $ UserをDollarUserにすることは役に立ちません。 – schnaader

+0

真ですが、ユーザーが使用できない一連の文字を作成することができます。コンパイラが特定の事柄のためにコードを発行するとき、C#の場合とほとんど同じです。 – jasonh

0

ユーザはディレクトリの正確な名前を知る必要がありますか?もしそうでなければ、任意のルールを使ってディレクトリを作成し、それぞれの所有者をDBなどに関連付けるのはなぜですか?

+0

それはうまくいく、私は常に名前の代わりにuserIDを使用することができます。私はちょうどbcという名前が欲しいです。 –

5

文字がASCII/Unicodeであるかどうかによって、バイト/文字の値を代わりに使用し、置換された文字(アンダースコアなど)に印を付けて_001_255_200ValidPart_095_253のような文字を使用できます。マーキング文字も置き換えなければならないことに注意してください(この例では_095、95はアンダースコアのASCIIコードです)。

+0

ええ、エンコーディングスキームを選ぶのは簡単です。難しいのは、どのキャラクターが脱出するかを知ることです。 –

+0

あまりにも多くの文字をエスケープしても、実際にここで傷つくことはありませんが、f.e.有効なものとしてA-Z、a-z、0-9を使用してください。 – schnaader

10

無効な文字を置き換えても削除しても、常に衝突する可能性があります。私の場合は、ユーザーのために別のプライマリキー(おそらくGUID)を持っていて、それをディレクトリ名として使用します。そうすれば、無効なディレクトリ名を気にせずに、ユーザー名に任意の名前を付けることができます。

+3

なぜdownvote、匿名ユーザーですか?私はまだこれがより良い解決策であると信じています。さもなければ、Bobby \とBobby /は両方とも同じディレクトリを取得し、それが競合の原因になります。 – Jacob

+0

質問は、ファイル名ルールと互換性のあるテキストエスケープ戦略です。別々のデータ構造を作成して維持することによって完全にエスケープするのを避けることは、問題の解決策になるかもしれませんが、その質問には答えません。 –

+2

Meh、私は人々が主にStack Overflowを使って質問に答えただけでなく、自分たちの問題に対する解決策を見つけると思っています。誰かが「このHTMLを正規表現でどのように解析するのか」など、間違った質問をしている場合は、このアプローチの欠陥を指摘することをお勧めします。 – Jacob

1

あなたはすべてのインスタンスで有効な非衝突ディレクトリ名を与えるユーザ名からエスケープする方法を見つけるつもりはありません。

さらに信頼できるアプローチは、任意の規則を使用してディレクトリを作成し、その2つの間にマッピングを格納することです。これは、ユーザーが名前を変更できるようにするためのサポートも提供します。

詳細については、663520をご覧ください。

関連する問題