-1

プログラムに .txt からコードを読み取らせ、それを読み取らせようとしていますが、何らかの理由で、コンパイル時にプログラムがクラッシュします。誰かが私が間違っていることを教えてもらえますか? ありがとう!:)

using System;
using System.IO;

public class Hello1
{
    public static void Main()
    {   
        string    winDir=System.Environment.GetEnvironmentVariable("windir");
        StreamReader reader=new  StreamReader(winDir + "\\Name.txt");
            try {      
            do {
                        Console.WriteLine(reader.ReadLine());
            }   
            while(reader.Peek() != -1);
            }      
            catch 
            { 
            Console.WriteLine("File is empty");
            }
            finally
            {
            reader.Close();
            }

    Console.ReadLine();
    }
}
4

6 に答える 6

3

2 つの単純な理由から、あなたのソリューションは好きではありません。

1)私はすべてをキャッチしなければならないのは好きではありません(キャッチしてみてください)。を使用してファイルが存在するかどうかを確認するためにSystem.IO.File.Exist("YourPath")

2) このコードを使用しても、ストリームリーダーは破棄されません。これを回避するには、次のように using コンストラクターを使用することをお勧めします。using(StreamReader sr=new StreamReader(path)){ //Your code}

使用例:

        string path="filePath";
        if (System.IO.File.Exists(path))
            using (System.IO.StreamReader sr = new System.IO.StreamReader(path))
            {
                while (sr.Peek() > -1)
                    Console.WriteLine(sr.ReadLine());
            }
        else
            Console.WriteLine("The file not exist!");
于 2013-10-08T19:39:05.743 に答える
0

.NET フレームワークには、テキスト ファイルを読み取るためのさまざまな方法があります。それぞれに長所と短所があります... 2つ見てみましょう。

最初は、他の多くの回答が推奨しているものです。

String allTxt = File.ReadAllText(Path.Combine(winDir, "Name.txt"));

これにより、ファイル全体が単一のString. それは迅速かつ無痛になります。ただし、リスクが伴います...ファイルが十分に大きい場合、メモリが不足する可能性があります。全体をメモリに保存できたとしても、ページングが発生するほど大きくなり、ソフトウェアの実行が非常に遅くなる可能性があります。次のオプションはこれに対処します。

2 番目の解決策では、ファイル全体をメモリにロードせずに、一度に 1 行ずつ作業できます。

foreach(String line in File.ReadLines(Path.Combine(winDir, "Name.txt")))
  // Do Work with the single line.
  Console.WriteLine(line);

この解決策は、ファイルの内容でより頻繁に機能するため、ファイルの場合は少し時間がかかる場合があります...ただし、厄介なメモリエラーを防ぐことができます。

Strings私は 2 番目の解決策を採用する傾向がありますが、これは、メモリに巨大なものをロードすることに偏執的であるという理由だけです。

于 2013-10-08T19:45:04.737 に答える