2015-04-02 64 views
0

我有下面的代码搜索目录(z :),它返回昨天的所有文件,我需要阅读今天的文件列表,然后逐行阅读和搜索任何错误消息,如果我在文件中发现任何错误消息,我想写出文件名,然后写入文件中的错误消息,错误可以包含不同数量的行。逐行解析文件的目录中的错误消息

我遇到的第一个问题是当我尝试使用File.ReadLines(file)读取今天的文件列表时;它不喜欢这样,然后我还需要格式化写入文件名,然后输入错误消息以及它可以包含的不同行号。

这些文件采用.htm格式。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 

namespace NetworkSearch 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       DateTime today = DateTime.Now.AddDays(-1); 

       FileInfo[] todaysFiles = new DirectoryInfo(@"z:\") 
          .EnumerateFiles() 
          .Select(x => { 
          x.Refresh(); 
          return x; 
          }) 
         .Where(x => x.CreationTime.Date == today ||  x.LastWriteTime >= today) 
         .ToArray() 
         ; 

       string fileName = @"D:\Temp\Network.txt"; 

       if (File.Exists(fileName)) 
       { 
        File.Delete(fileName); 
       } 

       using (StreamWriter sw = File.CreateText(fileName)) 

       foreach (FileInfo file in todaysFiles) 
       { 
        File.ReadLines(file); 
        if (line.Contains("ERROR")) 
        { 
         sw.WriteLine("----- ERROR -----"); 
         sw.WriteLine(file); //file name 
         sw.WriteLine(errLine); //errline can contain diff nos of lines 
         sw.WriteLine("----- ERROR -----"); 
        } 
       } 
      } 
      catch (UnauthorizedAccessException UAEx) 
      { 
       Console.WriteLine(UAEx.Message); 
      } 
      catch (PathTooLongException PathEx) 
      { 
       Console.WriteLine(PathEx.Message); 
      } 
     } 
    } 
} 

回答

1
using (StreamWriter sw = File.CreateText(fileName)) 
{ 
    foreach (FileInfo file in todaysFiles) 
    { 
     var errorLines = File.ReadLines(file.FullName).Where(l => l.Contains("ERROR")).ToList(); 
     if (errorLines.Any()) 
     { 
      sw.WriteLine("----- ERROR -----"); 
      sw.WriteLine(file.Name); //file name 
      foreach (var errLine in errorLines) 
      { 
       sw.WriteLine(errLine); 
      } 
      sw.WriteLine("----- ERROR -----"); 
     } 
    } 
} 
+0

感谢您的帮助纪尧姆。 – John 2015-04-02 13:22:08

0

File.ReadLines返回IEnumerable<string>。为了得到一条线,你必须循环。这需要string path作为参数,而不是FileInfo

using (StreamWriter sw = File.CreateText(fileName)) 
{ 
    foreach (FileInfo file in todaysFiles) 
    { 
     foreach(string line = File.ReadLines(file.FullName)); 
     { 
      if (line.Contains("ERROR")) 
      { 
       string errLine = "my error"; 

       sw.WriteLine("----- ERROR -----"); 
       sw.WriteLine(file.Name); //file name 
       sw.WriteLine(errLine); //errline can contain diff nos of lines 
       sw.WriteLine("----- ERROR -----"); 
      } 
     } 
    } 
} 
+0

感谢您的帮助stefankmitph – John 2015-04-02 13:23:58