如何检查文本文件中是否已存在richTextBox1中的行?

时间:2014-08-03 01:46:31

标签: c# .net winforms

在form1顶部:

private List<string> entriesRlines = new List<string>();
private List<string> entriesLines = new List<string>();
private string[] lines;
private List<string> RedAlerts;
private StreamWriter WriteAlerts;
private string AlertsDirectory;
private string AlertsFilename;
private string combineAlert;

在form1构造函数中:

AlertsDirectory = Path.GetDirectoryName(Application.LocalUserAppDataPath) + @"\alerts";
if (!Directory.Exists(AlertsDirectory))
{
  Directory.CreateDirectory(AlertsDirectory);
}
AlertsFilename = "Alerts.txt";
combineAlert = Path.Combine(AlertsDirectory, AlertsFilename);
if (File.Exists(combineAlert))
            {
                lines = File.ReadAllLines(combineAlert);
                label5.Text = lines.Length.ToString();
                RedAlerts = new List<string>(lines);
            }
            RedColorAlert();

然后是RedColorAlert方法:

private void RedColorAlert()
        {
            WriteAlerts = new StreamWriter(combineAlert,true);
            string[] rlines = richTextBox1.Lines;
            int linespos;
            if (lines != null)
            {
                for (int x = 0; x < lines.Length; x++)
                {
                    linespos = lines[x].IndexOf("===>");
                    string t = lines[x].Substring(linespos + 4);
                    entriesLines.Add(t);
                }
                for (int y = 0; y < rlines.Length; y += 4)
                {
                    entriesRlines.Add(rlines[y]);
                }
                for (int i = 0; i < entriesLines.Count; i++)
                {
                    for (int f = 0; f < entriesRlines.Count; f++)
                    {
                        if (!entriesLines[i].Contains(entriesRlines[f]))
                        {
                            if (entriesRlines[i].Contains("צבע אדום") || entriesRlines[i].Contains("אזעקה"))
                            {
                                timer3.Start();
                                WriteAlerts.WriteLine(DateTime.Now + "   ===>   " + entriesRlines[i]);
                                break;
                            }
                        }
                    }
                }
            }
            else
            {
                for (int i = 0; i < rlines.Length; i++)
                {
                    if (rlines[i].Contains("צבע אדום") || rlines[i].Contains("אזעקה"))
                    {
                        timer3.Start();
                        WriteAlerts.WriteLine(DateTime.Now + "   ===>   " + rlines[i]);
                    }
                }
            }
            WriteAlerts.Close();
        }

如果第一次文本文件为空,则第二部分为ELSE部分。 如果文本文件已经存在并且内部有一行或多行,则执行第一部分:

for (int i = 0; i < entriesLines.Count; i++)
                {
                    for (int f = 0; f < entriesRlines.Count; f++)
                    {
                        if (!entriesLines[i].Contains(entriesRlines[f]))
                        {
                            if (entriesRlines[i].Contains("צבע אדום") || entriesRlines[i].Contains("אזעקה"))
                            {
                                timer3.Start();
                                WriteAlerts.WriteLine(DateTime.Now + "   ===>   " + entriesRlines[i]);
                                break;
                            }
                        }
                    }
                }

这个循环循环由于某种原因写得不好,它一直进入内部并启动timer3和WriteLine,即使该行已经在文本文件中。我使用了一个断点。

这就是文本文件现在的样子:

2014年8月2日下午8:11:27 ===&gt; 18:46צבעאדוםבמ"אאשכול--נפילה。 אזרחנפצע,מפונהבמסו8/3/2014 4:25:08 AM ===&gt; 04:13בבממממ 8/3/2014 4:25:51 AM ===&gt; 04:13בבממממ 8/3/2014 4:26:50 AM ===&gt; 04:13צבעאדוםבמ"אשדותנגבושערהנגב

第二行应该像第三行和第四行,但第二行由于某种原因与第一行混合。 第三行和第四行应该与第二行相同,永远不要写。

这个想法是,如果一行也包含我所说的条件并且不存在于文本文件中,则在文本文件中添加一行新行。 如果一行已存在,请不要启动timer3,也不要再次写入。

这是文本文件中的行以及entriesLines:

中的行

2014年8月3日上午4:26:50 ===&gt; 04:13צבעאדוםבמ"אשדותנגבושערהנגב

这是一条不在文本文件中的行,或者它看起来像在richTextFile1和entriesRlines中:

04:36צבעדוםםמ

entriesRlines是List在包含它们之后包含richTextBox1的行。 entriesLines是List包含richTextBox1中的行。

1 个答案:

答案 0 :(得分:0)

你的一些希伯来字符串应该从右到左显示,例如

א

从右到左:http://www.fileformat.info/info/unicode/char/5d0/index.htm

(而且,Firefox并没有正确处理它!这就是为什么我必须把它放在自己的线上。)

也许GUI中显示的字符串不是你想象的那样,因为它们是从右到左显示的,但实际上是从左到右存储的?或相反亦然?谁知道Visual Studio在显示带有从右到左字符的字符串文字时会做什么?我当然不会......天啊! VS 2008似乎有时会从右向左显示它们!如果我将光标定位在其中一个字符串文字的开头,然后按向左箭头,它会跳转到字符串的末尾,然后向后移动!

我建议您调试问题的方法是使用以下某个实用程序确保您的字符串包含您希望按预期顺序的字符:

    public static IEnumerable<int> Utf32CodePoints(string s, int index)
    {
        for (int length = s.Length; index < length; index++)
        {
            yield return char.ConvertToUtf32(s, index);
            if (char.IsSurrogatePair(s, index))
                index++;
        }
    }

    public static IEnumerable<KeyValuePair<int, int>> Utf32IndexedCodePoints(string s, int index)
    {
        for (int length = s.Length; index < length; index++)
        {
            yield return new KeyValuePair<int, int>(index, char.ConvertToUtf32(s, index));
            if (char.IsSurrogatePair(s, index))
                index++;
        }
    }

接下来删除所有那些内联字符串文字(字符串文字在代码中永远不会出现多次)然后制作常量,例如:

    const string AlertType1 = "צבע אדום";
    const string AlertType2 = "אזעקה";

然后,使用这些实用程序,检查常量字符串,TextBox字符串和文件字符串,以查看字符的实际顺序。

顺便说一下,我建议你总是用尽可能小的范围声明你的字段和变量。例如。而不是字段“WriteAlerts”,你应该只在所需的范围内定义一个变量:

        using (var WriteAlerts = new StreamWriter(AlertsDirectoryAndName, true))
        {
            // your code
        }

更新

看起来Visual Studio 2008从左到右显示希伯来语字符串 - 即使在我的英语 - 美国语言环境中也是如此!我写了以下代码:

    const string Hebrew1 = "צבע אדום";
    const string Hebrew1ApparentFirstChar = "ם";

    static void TestHebrewConstantStringOrder() 
    {
        List<int> Hebrew1Utf32 = new List<int>(TextHelper.Utf32CodePoints(Hebrew1, 0));
        foreach (var codePoint in TextHelper.Utf32CodePoints(Hebrew1ApparentFirstChar, 0))
        {
            int index = Hebrew1Utf32.IndexOf(codePoint);
            Debug.WriteLine(string.Format("Index of U+{0:X8}:  {1}", codePoint, index));
        }
        Debug.WriteLine("Codepoints of " + Hebrew1);
        foreach (var pair in TextHelper.Utf32IndexedCodePoints(Hebrew1, 0))
        {
            string msg = string.Format("{0,7}: U+{1:X8}", pair.Key, pair.Value);
            Debug.WriteLine(msg);
        }
    }

得到以下输出:

Index of U+000005DD:  7
Codepoints of צבע אדום
      0: U+000005E6
      1: U+000005D1
      2: U+000005E2
      3: U+00000020
      4: U+000005D0
      5: U+000005D3
      6: U+000005D5
      7: U+000005DD
Codepoints of ם
      0: U+000005DD

而且,如果您的浏览器呈现的内容与我的不同(真正的可能性!),这里有屏幕截图:

Code

Output

正如您所看到的,看起来在字符串中第一个的“ם”字符实际上是最后一个。