“包含”不读取我的文本文件C#

时间:2018-01-19 11:30:55

标签: c# visual-studio

if (intBestNumberOfTries > intNumberOfTries)
{
    string searchFor = LoginForm.strLoginName;
    string line;
    using (StreamReader file = new StreamReader(@"NameList.txt"))
    {
        while ((line = file.ReadLine()) != null)
        {
            if (line.Contains(searchFor))
            {
                line.Remove(0);
            }
        }
    }
}
StreamWriter scoreboard = new StreamWriter(@"NameList.txt", true);
scoreboard.WriteLine(""[{0}] " + LoginForm.strLoginName + " scored: {1}", intBestNumberOfTries, intBestNumberOfTries);
scoreboard.Close();

我的Loginform.strLoginName;来自另一个编程文件。运行程序后,它不会删除整行。相反,它写了一个新的行。 searchFor是我在程序中的登录名。

3 个答案:

答案 0 :(得分:3)

这不能以您提供的方式完成。您需要重写文件

  

怎么样?

您必须将文件读入内存结构,删除内存中的行,然后将内容返回添加到文件中(它只是覆盖) 。

如果您处理的文件很大或很大,您必须逐行读取并创建临时文件(作为帮助程序),然后只需替换原始文件。

但是,如果文件很大,您可以使用asynchronous操作,以便不阻止当前线程。 c# StreamReader 功能使用StreamReader.ReadToEndAsync方法为此提供了解决方案。

现在,对于您的问题,您应该使用{strong>返回字符串数组的File.ReadAllLines方法。

string[] lines = File.ReadAllLines("NameList.txt");

最后一步是filter这个数组。

string[] filteredLines = lines.Where(l => !line.Contains(searchFor)).ToArray()

答案 1 :(得分:2)

字符串是不可变的,这就是为什么像String.Remove这样的每个string.method都会返回一个新字符串的原因。您必须将此返回的字符串分配给您的变量。例如:Remove(0)。虽然我认为你想要完全不同的东西(string[] allLines = File.ReadAllLines("NameList.txt"); string[] keepLines = Array.FindAll(allLines, line => !line.Contains(searchFor)); File.WriteAllLines("NameList.txt", keepLines); 将返回一个空字符串)。阅读方法的documentation以了解他们正在做什么。

如果你想从文件中删除这一行,你必须用你要保留的行重写它:

ReadLines

或使用LINQ(var allLines = File.ReadLines("NameList.txt"); var keepLines = allLines.Where(line => !line.Contains(searchFor)); File.WriteAllLines("NameList.txt", keepLines.ToList()); 使用流媒体方法):

{{1}}

答案 2 :(得分:0)

执行以下操作,您需要覆盖

        string tempFile = Path.GetTempFileName();

        using (var sr = new StreamReader("NameList.txt"))
        using (var sw = new StreamWriter(tempFile))
        {
            string line;

            while ((line = sr.ReadLine()) != null)
            {
                if (line.Contains(searchFor))
                    sw.WriteLine(line);
            }
        }

        File.Delete("NameList.txt");
        File.Move(tempFile, "NameList.txt");

您也可以使用Linq

来实现这一目标
var tempFile = Path.GetTempFileName();
var linesToKeep = File.ReadLines(fileName).Where(l => l.Contains(searchFor));

File.WriteAllLines(tempFile, linesToKeep);

File.Delete(fileName);
File.Move(tempFile, fileName);

如果你不处理大文件,那么你可以摆脱Temp文件

File.WriteAllLines(fileName, 
File.ReadLines(fileName).Where(l => !l.Contains(searchFor)).ToList());