c#一次读取3个文件,搜索字符串并显示结果

时间:2016-02-20 22:21:14

标签: c# file

我正在制作一个程序,它将同时打开3个文件,搜索字符串(游戏名称),然后在列表框中显示结果,其中包含3个文件中的信息。

到目前为止,我有这个

    string gamesData;
    string salesData;
    string compData;
    string textBox;

    StreamReader gamesFile, salesFile, compFile;

    gamesFile = File.OpenText("game.dat");
    salesFile = File.OpenText("SalesNumbers.dat");
    compFile = File.OpenText("company.dat");

    textBox = searchTxtBox.Text;


   while (!gamesFile.EndOfStream)
   {
        if (searchTxtBox.Text != "")
        {
            if(searchTxtBox.Text.Trim() == gamesData)
            {
                string.Compare(textBox, gamesData);
                gamesData = gamesFile.ReadLine();
                salesData = salesFile.ReadLine();
                compData = compFile.ReadLine();
                listBoxGames.Items.Add(gamesData +"====" + salesData + "====" + compData);
            }

            else 
                if (microRb.Checked)
                  {                           
                compData = "ms";
                  }
            else
                if (eaRb.Checked)
                {
                    compData = "ea";

                }
                else
                    {
                        compData = "blz";
                    }

        }

    }

        salesFile.Close();
        gamesFile.Close();
        compFile.Close();

当我点击搜索按钮时,程序变得无法响应我想知道是否有人指出我做错了什么,谢谢。

2 个答案:

答案 0 :(得分:0)

这听起来像你所追求的是多线程/并发/并行编程,并且有多种方法可以实现它......

所以这里有一些东西让你开始。

string[] textFilePaths = new string[]{"games.dat", "SalesNumbers.dat", "company.dat"};
ConcurrentBag<string> bagOfStrings = new ConcurrentBag<string>();

Parallel.ForEach(textFilePaths, path => 
{
    string text = File.ReadAllText(path);
    bagOfStrings.Add(text);
});

foreach(var text in bagOfStrings)
{
    Console.WriteLine (text);
}

答案 1 :(得分:0)

您的代码会创建一个无限循环。您的while循环不会停止,直到gamesFile结束。但是,您gamesFile实际读取的行不会运行,因为它被if (searchTxtBox.Text.Trim() == gamesData)包围。您的gamesData变量在前几行中声明,但尚未分配值,因此它为空。 searchTxtBox.Text.Trim()不等于null,所以你永远不会从gamesFile中读取。所以,你永远不会到gamesFile的末尾,你的while循环会永远运行。

读取文件中的行的常用习惯是这样的:

while ((gamesData = gamesFile.ReadLine()) != null)
{
    // do something with gamesData here
}

这是有效的,因为ReadLine在到达文件末尾时返回null。所以,你可以这样写:

while ((gamesData = gamesFile.ReadLine()) != null && (salesData = salesFile.ReadLine()) != null)