如果 CSharp 包含一些字符串,则通过循环跳过文件

CSharp skip file through loop if it contains some string

早上好, 我正在遍历文件夹中的许多文本文件以获取写入其中的文本。 文件名由另一个程序自动写入 date_filename.id 等标准,因此我无法根据文件名过滤文件...

我注意到他们在第一行有一个文件标识,例如 ORDERRSomething else 所以我在想如果第一行包含一些 [=24] 是否有一些方法可以跳过文件=] 循环现在看起来像这样:

 DirectoryInfo FilesPath = new DirectoryInfo(path);
 var Files = FilesPath.GetFiles();
 foreach (var file in Files)
        {
            List<string> lines = new List<string>();
            using (StreamReader sr = file.OpenText())
            {

                string s = "";
                while ((s = sr.ReadLine()) != null)
                {
                    if (s.Contains("ORDERR"))
                    {
                        "Do something"
                    }
                    else
                    {
                        break;
                    }
                }


            }

但是当循环到达第二行时,很明显,它会跳过其余部分。 我能做什么?

提前感谢您的任何帮助

(我无法通过 Whosebug 找到一些东西)

我不确定我是否真的满足了您的要求。但这不是很简单吗(使用 LINQ 提高可读性):

var relevantFiles = new DirectoryInfo(path).EnumerateFiles()
   .Where(f => File.ReadLines(f.FullName).ElementAtOrDefault(0)?.Contains("ORDERR")==false); 

请注意,我使用的 EnumerateFiles 效率更高,因为它不需要将所有文件加载到内存中,即使您想跳过它们也是如此。这同样适用于 File.ReadLines(相对于 ReadAllLines)。 Enumerable.ElementAtOrDefault returns null 如果文件为空,这就是我使用空条件运算符 ? 的原因。因此查询将跳过第一行包含 ORDERR.

的文件

你需要的是一个标志来设置和中断读取循环

DirectoryInfo FilesPath = new DirectoryInfo(path);
var Files = FilesPath.GetFiles();
foreach (var file in Files)
{
    bool hasError = false;
    List<string> lines = new List<string>();
    using (StreamReader sr = file.OpenText())
    {
        string s = "";
        while ((s = sr.ReadLine()) != null)
        {
            if (s.Contains("ORDERR"))
            {
                hasError = true;
                break;
             } else {
                lines.Add(s)
             }
        }
    }

    if (!hasError) 
    {
        // do something with lines as we were ok with it 
    }
}