如果 CSharp 包含一些字符串,则通过循环跳过文件
CSharp skip file through loop if it contains some string
早上好,
我正在遍历文件夹中的许多文本文件以获取写入其中的文本。
文件名由另一个程序自动写入 date_filename.id
等标准,因此我无法根据文件名过滤文件...
我注意到他们在第一行有一个文件标识,例如 ORDERR
或 Something 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
}
}
早上好,
我正在遍历文件夹中的许多文本文件以获取写入其中的文本。
文件名由另一个程序自动写入 date_filename.id
等标准,因此我无法根据文件名过滤文件...
我注意到他们在第一行有一个文件标识,例如 ORDERR
或 Something 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
}
}