2

相対ファイル 'character/attacks.txt' の内容を読み取る必要がある C# Visual Studio 2008 フォームがあります File.Exists() を実行すると、ディレクトリがソートされているにもかかわらず、false が返されます。コード:

            try
            {
                System.IO.StreamReader file = new System.IO.StreamReader("character/attacks.txt");
                int counter = 0;
                int numberOfLines = 0;
                string line;
                while ((line = file.ReadLine()) != null) { numberOfLines++; }
                string[] attacks = new string[numberOfLines];
                while ((line = file.ReadLine()) != null) { attacks[counter] = line; counter++; }
                file.Close();
                print(attacks.ToString());
            }
            catch (Exception ex) 
            {
                print("ERROR"); print("Did you edit any files?"); print(ex.ToString()); 
            }

例外エラー:

System.IO.FileNotFoundException: Could not find file 'D:\Users\Andrey\Desktop\Turn\character\attacks.txt'.
File name: 'D:\Users\Andrey\Desktop\Turn\character\attacks.txt'
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
   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 TurnByTurn.Form1.button1_Click(Object sender, EventArgs e) in D:\Users\Andrey\Desktop\C#\TurnByTurn\TurnByTurn\Form1.cs:line 52

私は自分のコードを Python から移植していますが、これで問題が発生したことはありません。前もって感謝します!

4

6 に答える 6

7

それは非常に奇妙です。attacks.txtコンピューターはディレクトリにファイルがないと固く信じているようですD:\Users\Andrey\Desktop\Turn\character\が、あなたは確かに存在すると言います。そのうちの 1 人は間違っているに違いありません。私は長年にわたって、コンピューターが私よりも正しいことが多いことを学びました。

.txtファイルに拡張子ではなく、実際に拡張子が付いていると確信しています.txt.somethingelseか? Windows シェルでファイル拡張子の表示をオフにしている場合、この余分なファイル拡張子が表示されない可能性があります。ただし、コンピューターは内部的にそれを見逃しているわけではなく、要求したファイルとはまったく異なるファイルとして認識しています。それはこの男が抱えていたのと同じ問題です。

Windows エクスプローラーを再構成するには:

  1. コントロール パネル フォルダを開きます。
  2. 「フォルダ オプション」をクリックします。
  3. 「表示」タブに切り替えます。
  4. [詳細設定] リスト ボックスの項目のリストで [隠しファイル、隠しフォルダー、および隠しドライブを表示する] ラジオ ボタンを見つけて、それが選択されていることを確認します。
  5. [OK] をクリックします。

この質問に対する他の回答は、いくつかの良い提案をします。その中で:

  1. 文字列リテラルでバックスラッシュ (標準の Windows パス区切り文字) を使用する場合は、2 つ目のバックスラッシュを使用して「エスケープ」してください。\tこれが必要な理由は、バックスラッシュが C# コンパイラによってエスケープ文字として解釈され、タブの挿入などを入力できるようになるためです。通常のバックスラッシュを挿入する場合は、エスケープ <code>\\ をエスケープする必要があります。これが、単一のバックスラッシュを使用しようとしたときにエラーが発生した理由です。

  2. バックスラッシュ文字をエスケープする代わりに、C# コンパイラに、スペースを含めて入力されたとおりに文字列リテラルを解釈するように指示できます。これらは逐語的文字列リテラルと呼ばれます。これを行うには、文字列の前に文字を付けます@。例えば:@"C:\MyDirectory\MyFile.txt"

  3. 現在使用しているスラッシュ文字が機能する理由は、厳密には下位互換性のためです。これはエラーの原因ではありません (検索対象のパスを含む例外メッセージからわかるように) が、パスにスラッシュを使用することはおそらくまだ良い考えではありません。前述したように、バックスラッシュは Windows の標準的なパス区切り文字です。

于 2012-08-02T05:04:42.010 に答える
0

ファイル名に「\」が含まれているため、ファイルがめちゃくちゃになっていて、文字フォルダーで attack.txt ファイルを探すように指示されている可能性があります。

編集: または少なくとも、ファイルにスラッシュが含まれていることを伝えているように見えます。エラーで表示されるファイル パスは、マシン上のファイルの実際の場所ですか?

于 2012-08-02T04:17:10.787 に答える
0

「/」を「\」に置き換えると、無効な文字エラーが発生します。2つのスラッシュでこれを試してください

System.IO.StreamReader file = new System.IO.StreamReader("character\\attacks.txt");

また

System.IO.StreamReader file = new System.IO.StreamReader(@"character\attacks.txt");
于 2012-08-02T04:27:49.187 に答える
0
  1. Posixis/および in Windowsisのパス スプリッター\
  2. Directory.GetCurrentDirectory現在のディレクトリが正しいことを確認するために使用します。
  3. 現在のディレクトリが正しくない場合は、フル パスを使用するか、現在のディレクトリを次のように変更します。Directory.SetCurrentDirectory
于 2012-08-02T05:38:11.980 に答える