-1

私のパスは UTF-16 文字列です。それらのほとんどはASCIIセットのみを使用するため、次のようなファイル名は次のようtestに保存されます

T \x00 E \x00 S \x00 T \x00

Encoding.Unicode.GetString(bytes)は文字列を読み取るために使用し、正常に動作します(コンソールまたはフォームコントロールに出力すると、期待どおりに表示されます)が、次のコードを使用して、指定されたファイル名で実際にファイルを作成したい場合

BinaryWriter outFile = new BinaryWriter(File.OpenWrite(path));

例外が発生します

Unhandled Exception: System.ArgumentException: Illegal characters in path.
   at System.IO.Path.CheckInvalidPathChars(String path)
   at System.IO.Path.GetFileName(String path)

おそらくそこにnull文字があるためです(元のバイト配列を内部に保存している可能性があります)が、それを処理する方法がわかりません。ただし、すべての文字列が ASCII であるわけではなく、一部の文字は 2 バイトを使用します。

アップデート:

不正なバイトは、文字列に埋め込まれた単純な null バイトであることが判明しました。ただし、末尾の null バイトをすべて単純に削除することはできませんが、文字列の長さもわかりません。各文字が n バイトで格納されている文字列から null バイトを削除するにはどうすればよいですか?

4

2 に答える 2

2

MSDN の「Path.GetInvalidPathChars」から

無効な文字の完全なセットは、ファイル システムによって異なります。たとえば、Windows ベースのデスクトップ プラットフォームでは、無効なパス文字には 1 ~ 31 の ASCII/Unicode 文字に加えて、引用符 (")、より小さい (<)、より大きい (>)、パイプ (|)、バックスペース ( \b)、ヌル (\0)、およびタブ (\t)。

Path.GetInvalidPathCharsフィルターとして使えます。からの文字に一致する文字をフィルタリングしながら、入力文字列を出力文字列にコピーしますPath.CheckInvalidPathChars

これが私が調理した例です:

string input = @"This <path> ""contains"" |some| ~invalid~ characters";

var invalidChars = Path.GetInvalidPathChars();

string output = input.Aggregate(new StringBuilder(), (sb, c) => invalidChars.Contains(c) ? sb : sb.Append(c), sb => sb.ToString());

// output contains: This path contains some ~invalid~ characters

ほとんどの記号は除外されますが、チルダは有効なパス文字であるため除外されないことに注意してください。

于 2012-08-19T21:19:39.193 に答える
1

このエラーが発生する可能性が最も高いのは、 を呼び出した場合に使用できる無効な文字の 1 つがパスに含まれているためですPath.GetInvalidPathChars()

これらの文字の一部は、、、"およびです。<|>

この問題を使用して既に文字列をデコードしているためEncoding.Unicode.GetString、UNICODE エンコーディングの問題とは関係ありません。

以下は、パス内の無効な文字をアンダースコアに置き換える単純な (しかしあまり効率的ではない) コードです。

var stringBuilder = path
  .Select(c => Path.GetInvalidPathChars().Contains(c) ? '_' : c)
  .Aggregate(new StringBuilder(), (a, c) => a.Append(c));
path = stringBuilder.ToString();
于 2012-08-19T21:20:08.607 に答える