2016-04-08 10 views
0

Bir metin dosyasının string içerip içermediğini bulmaya çalışıyorum. Bir kelime metin dosyası içinde yer ise string o zaman yeni bir konuma dosya kopyalamak, listedeki textwords içinde bulunan string 's herhangi biri olabilir ben yaşıyorum sorunu olduğunuBir liste içinde bulunan bir metin dosyasında bir dize bulma <string>

Program, textwords'daki tüm kelimelerle değişmez, sadece listenin ilk değerini alır. Listedeki tüm dizelerle döngüye nasıl geçebilirim ve dosyayı kopyalamadan önce metin dosyasında yer alıp almadıklarını görün.

Herhangi bir yardım için teşekkür ederiz. Benim kod aşağıda

, Sen eğer 'hem de 'kırılma' ifadeleri ve else koşullar var

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; 
      } 
     } 
    } 

} 
+0

almaz Hayır şaka nasıl 'size kopyasını gerçekleştirmek ve ilk geçişte
yılında vazgeçireceksin: Daha iyi bir (henüz mükemmel değil) biridir textwords' bildirildi ve oluşturuldu? Birden fazla 'string' değeri içerdiğinden emin misiniz? – CodingGorilla

+0

break, her ikisi de break – Martheen

cevap

1

Ancak ikinci sözcüğün

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()); 
    }   
} 
+0

Teşekkürler! Yaptığım yerde 'break' yazmanın listeden döngüleri durduracağını anlayamadım. – bdg

1

. Bu nedenle, ilk dizgenin ötesine asla geçmeyecek.

0

İfadelerin sonunda break kullanıyorsunuz. Bu döngüyi kıracak. Bunun yerine continue kullanmalısınız.

Ancak bu continue, dosyayı kopyalamak için bir if-else işlevini kullandığınızdan ve başka bir şey kullanmadığınız için işe yaramıyor. Bu durumda break'dan kurtulabilirsiniz. Program, if ifadesini yürütür ve bloğun sonunda, başka ifadeyi görmezden gelir (veya tersini) ve döngüyü yineleyin.

0

İlk yinelemeden sonra durmasına neden olan "ara ver" seçeneğiniz vardır. Bunun gibi bir arama da işe yaramaz.

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()); 
     } 
    } 
} 
+0

ile biterse, sonu sona erecektir Genel olarak, eldeki soru değilse, özellikle "varsayım" özelliklerinden kaçınmaya çalışırdım. Şartnamesinin anahtar kelimeyi kırpması gerektiğine ve bütün bir kelime olması gerektiğine inanıyorsunuz (anahtar kelime, kelime sınırlarına göre olmalıdır). Böyle olması gerektiğini düşünmek mantıklıdır, ama onun kodunun ne yapması gerektiğini değiştiriyorsunuz (yine, soruyla ilgisiz bir kısımda) ve bu değişikliklerin OP – Jcl

+0

'a herhangi bir açıklama vermemesi dizelerin zaten halihazırda İçeride olmaları gerektiği, bu listeye eklendiklerinde yapıldı. Şu anda sorunu sıraladım öneri için zaten teşekkür ederim. – bdg

İlgili konular