3

StreamReaderC#でオブジェクトを開くのに問題があります。私はいつも例外を受け取りますIllegal characters in path。それを機能させる唯一の方法は、ファイルパス内の文字を@エスケープしないように、シンボルを使用してパス名全体を使用する場合です。\ただし、別のメソッド(変更できない)からの出力として、ファイルのパスとファイルの名前の2つの別々の変数から始めるため、これは実際には役に立ちません。

私はすべて失敗した8つの順列を経験しましたが、参考のために以下にコメントアウトされています。ここで読みやすくするために、別のメソッドからの出力としてそれらの値を受け取る代わりに、私が宣言dirIniしているふりをします。fileIniそうは言っても、宣言スタイル1と2の両方が、4つの連結メソッドすべてを使用して失敗しました。ここで何が起こっているのですか?他の例では、4つの連結メソッドすべてが機能するのを見てきました。

編集: コードを簡略化して、壊れたものの1つのバージョンを表示しました:

string dirIni = @"C:\Users\Dan\AppData\Local\MyApp 4.0\INI\";
string fileIni = @"PWTRANSACTION.INI";

try
{
    string transIniFullFileName = Path.Combine(dirIni, fileIni);

    using (StreamReader file = new StreamReader(transIniFullFileName))
    {
        // do StreamReader stuff...
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

例外のスタックトレースは次のとおりです。

   at System.IO.Path.CheckInvalidPathChars(String path)
   at System.IO.Path.GetFileName(String path)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
   at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize)
   at System.IO.StreamReader..ctor(String path)
   at TestApp.Form1.btnTestRead_Click(Object sender, EventArgs e) in C:\Users\Dan\TestApp\Form1.cs:line 4977
4

3 に答える 3

4

問題は、メソッドが最後にフィールド区切り文字を含む文字列を返すことでした。これは不正な文字でした。テストコードでもこれらの文字列を使用していました。コードをメモ帳++に貼り付け、「隠し文字を表示」をオンにすると、FS文字が表示されました。FS を削除した後、すべてが正常に実行されました。コードのテストを手伝ってくれてありがとう、特に @Dynguss。

VSが不正なキャラクターの例外を与えるときはいつでも、潜在的な隠しキャラクターをチェックしてください!

于 2012-09-26T15:27:16.860 に答える
3

以下が機能するはずです。

string dirIni = @"C:\Users\Dan\AppData\Local\MyApp 4.0\INI";
string fileIni = "PWTRANSACTION.INI";
string transIniFullFileName = Path.Combine(dirIni, fileIni);

ローカルアプリケーションデータフォルダのハードコーディングを回避するには、次の手順に従います。

string localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
string dirIni = @"MyApp 4.0\INI";
string fileIni = "PWTRANSACTION.INI";
string transIniFullFileName = Path.Combine(localAppData, dirIni, fileIni);

ちなみに、次の2つの文字列宣言は完全に同じです

string transIniFullFileName = "C:\\Users\\Dan\\AppData\\Local\\MyApp 4.0\\INI\\PWTRANSACTION.INI";
string transIniFullFileName = @"C:\Users\Dan\AppData\Local\MyApp 4.0\INI\PWTRANSACTION.INI";

したがって、最初のコードは失敗し、2番目のコードは成功すると言っている場合は、他に失敗しているものがあり、実際のコードを表示していないと思います。

于 2012-09-26T14:42:09.663 に答える