在List <string>

时间:2016-04-08 16:56:26

标签: c# string

我试图找出文本文件是否包含stringstring可以是列表string中包含的textwords中的任何一个,如果文本文件中包含单词,则会将文件复制到新位置

我遇到的问题是程序没有遍历textwords中的所有单词,它只接受列表的第一个值。如何让它循环遍历列表中的所有字符串,并在复制文件之前查看它们是否包含在文本文件中。

任何帮助都将不胜感激。

我的代码如下,

foreach (FileInfo file in files)
{
    //reads the file contents
    bool nextouterloop = false;
    using (StreamReader ReadMessage = new StreamReader(file.FullName))
    {
        String MessageContents = ReadMessage.ReadToEnd();
        //checks if the textwords are present in the file


        foreach ( string Keyword in textwords )
        {

            //if they are file is moved to quarantine messages

            if ( MessageContents.Contains(Keyword) )
            {
                try
                {
                    File.Copy(file.FullName,
                        @"F:\UNI\Year 2\Tri 2\Software Engineering Methods\Coursework\Noogle system\Quarantin_Messages\" +
                        file);

                }
                catch ( IOException cannot_Move_File )
                {
                    MessageBox.Show(cannot_Move_File.ToString());
                }
                break;
            }
            //else it is moved To valid messages
            else
            {
                try
                {
                    File.Copy(file.FullName,
                        @"F:\UNI\Year 2\Tri 2\Software Engineering Methods\Coursework\Noogle system\Valid_Messages\" +
                        file);
                }
                catch ( IOException cannot_Move_File )
                {
                    MessageBox.Show(cannot_Move_File.ToString());
                }
                break;
            }
        }
    }

}

4 个答案:

答案 0 :(得分:1)

你已经打破了&#39;在&#39; if&#39;中的陈述和&#39;其他&#39;条件。因此它永远不会超越第一个字符串。

答案 1 :(得分:1)

但是你在第一遍中执行复制和中断 不开玩笑没有得到第二个字

foreach (FileInfo file in files)
{    
    string path = @"F:\UNI\Year 2\Tri 2\Software Engineering Methods\Coursework\Noogle system\Valid_Messages\";
    //reads the file contents
    using (StreamReader ReadMessage = new StreamReader(file.FullName))
    {
        String MessageContents = ReadMessage.ReadToEnd();
        //checks if the textwords are present in the file               
        foreach (string Keyword in textwords)
        {
            if (MessageContents.Contains(Keyword))
            {
                path = @"F:\UNI\Year 2\Tri 2\Software Engineering Methods\Coursework\Noogle system\Quarantin_Messages\"
                break;
            }
        }                 
    }
    // let the StreamReader close down before the copy  
    // don't need it anymore  
    try
    {
        File.Copy(file.FullName, path + file);
    }
    catch (IOException cannot_Move_File)
    {
        MessageBox.Show(cannot_Move_File.ToString());
    }           
}

答案 2 :(得分:0)

您在语句结尾处使用break。这将打破循环。您应该使用continue代替。

但是这个continue将毫无用处,因为你只使用if-else函数来复制文件而已。在这种情况下,你可以摆脱break。程序将执行if语句,并在块结束时忽略else语句(反之亦然)并迭代循环。

答案 3 :(得分:0)

你有&#34;休息&#34;导致它在第一次迭代后停止。像这样的搜索也不会起作用。一个更好(但不完美)的是:

foreach (FileInfo file in files)
{
    //reads the file contents
    var content = File.ReadAllText(file.FullName);

    if (textwords.Any(tw => Regex.IsMatch(content, @"\b" + tw.Trim() + @"\b", RegexOptions.IgnoreCase))
    {
        try
        {
            File.Move(file.FullName, Path.Combine(@"F:\UNI\Year 2\Tri 2\Software Engineering Methods\Coursework\Noogle system\Quarantin_Messages", file.Name));
        }
        catch (IOException cannot_Move_File)
        {
            MessageBox.Show(cannot_Move_File.ToString());
        }
    }
    else
    {
        //else it is moved To valid messages
        try
        {
            File.Copy(file.FullName, @"F:\UNI\Year 2\Tri 2\Software Engineering Methods\Coursework\Noogle system\Valid_Messages\" + file.Name);
        }
        catch (IOException cannot_Move_File)
        {
            MessageBox.Show(cannot_Move_File.ToString());
        }
    }
}