检查文件中是否存在字符串

时间:2013-12-01 06:08:27

标签: c# string streamreader

我有以下代码打开文本文件并读取文件中的所有行并将其存储到字符串数组中。

然后检查字符串是否存在于数组中。 然而,我面临的问题是,无论何时找到字符串,它总是显示“有匹配”以及“没有匹配”。 知道如何解决这个问题吗?

检查此代码:

using (StreamReader sr = File.OpenText(path))
{
    string[] lines = File.ReadAllLines(path);
    for (int x = 0; x < lines.Length - 1; x++)
    {
        if (domain == lines[x])
        {
            sr.Close();
            MessageBox.Show("there is a match");
        }
    }
    if (sr != null)
    {
        sr.Close();
        MessageBox.Show("there is no match");
    }
}

7 个答案:

答案 0 :(得分:20)

听起来过于复杂,如果你想知道文件中是否存在字符串,没有理由按行检查。您只需使用以下命令替换所有代码:

if(File.ReadAllText(path).Contains(domain))
{
    MessageBox.Show("There is a match");
}

答案 1 :(得分:5)

我建议使用seting和flag并按如下方式检查...

using (StreamReader sr = File.OpenText(path))
{
    string[] lines = File.ReadAllLines(path);
    bool isMatch = false;
    for (int x = 0; x < lines.Length - 1; x++)
    {
        if (domain == lines[x])
        {
            sr.Close();
            MessageBox.Show("there is a match");
            isMatch = true;
        }
    }
    if (!isMatch)
    {
        sr.Close();
        MessageBox.Show("there is no match");
    }
}

祝你好运!

答案 2 :(得分:2)

实际上你不需要将整个文件读入内存。有File.ReadLines方法允许您逐个枚举文件行,而无需读取整个文件。您可以创建以下方法

private bool DomainExists(string domain)
{
    foreach(string line in File.ReadLines(path))
        if (domain == line)
            return true; // and stop reading lines

    return false;
}

此方法的用法如下:

if (DomainExists(domain))
    MessageBox.Show("there is a match");
else
    MessageBox.Show("there is no match");

还有两个附注 - 如果您正在阅读StreamReader行(它在内部创建阅读器),则不需要File.ReadAllLines。只需检查 - 您甚至不会在任何地方使用sr变量。第二个注意事项 - 如果将其包装在using块中,则无需手动关闭流。在这种情况下,流将自动处理和关闭。

答案 3 :(得分:0)

最简单的方法:

string content = File.ReadAllText(path);
if (content.IndexOf(domain) > -1)
{
   // domain exists
}
else
{
   // domain does not exist
}

现在要分析你的代码:

1,您正在创建StreamReader实例,但稍后不会在代码中使用它。

2,如果域名在文件中多次出现怎么办?在您的代码中,您的代码中会出现多个“匹配”。

using (StreamReader sr = File.OpenText(path)) // you can remove this line
{
    string[] lines = File.ReadAllLines(path); // as you are not using it here
    for (int x = 0; x < lines.Length - 1; x++)
    {
        if (domain == lines[x])
        {
            sr.Close();
            MessageBox.Show("there is a match");
            hasMatch = true;
            break; // exit loop if found
        }
    }

    if (!hasMatch)
    {
        // there is no match
    }

    if (sr != null) // you dont need this if you remove it from the beginning of the code
    {
        sr.Close();
        MessageBox.Show("there is no match");
    }
}

答案 4 :(得分:0)

您可以尝试以下操作:


首先,您需要创建一个接收字符串类型数组的方法,然后将其转换为字符串,然后从txt中读取所有文本,然后可以使用(包含)知道我们发送的文本是否存在于txt中,并且我们验证这是真还是假,希望对您有帮助。

useState

答案 5 :(得分:-1)

您可以尝试以下代码:

 using (StreamReader sr = File.OpenText(path))
                        {
                            string[] lines = File.ReadAllLines(path);
                            for (int x = 0; x < lines.Length - 1; x++)
                            {
                                if (lines[x].Contains(domain, StringComparison.InvariantCultureIgnoreCase)
                                {
                                    sr.Close();
                                    MessageBox.Show("there is a match");
                                }
                            }
                            if (sr != null)
                            {
                                sr.Close();
                                MessageBox.Show("there is no match");
                            }
                        }

答案 6 :(得分:-1)

尝试尝试抓住:

string x;

string log = @"C:\Users\Log.txt";

string ruta = @"C:\Users\x.txt";

if (File.Exists(ruta))
{                    
    try
    {
        x = File.ReadAllText(ruta);  
    }
    catch (Exception ex)
    {
        File.AppendAllText(ruta, "Something");
        File.AppendAllText(log, Environment.NewLine + DateTime.Now.ToString() + ": The file not contain a string. " + ex.Message);
    }
}