我正在尝试在文件数组中搜索特定值。我不确定我在这里缺少什么,但是一些见识会很棒。
我尝试将每个文件中的所有行都包含到一个数组中,该数组可以从if statement
中读取。
void getAssetTag()
{
string path = @"\\SERVER\SHARE\FOLDER";
DirectoryInfo d = new DirectoryInfo(path);//Grabbing Directory
FileInfo[] Files = d.GetFiles("*.txt"); //Getting Text files
foreach (FileInfo file in Files)
{
string[] asset = File.ReadAllLines(file.FullName);
if (asset.Contains(AssetT.Text) == true) {
string allinfo = File.ReadAllText(file.FullName);
Results.Text = allinfo;
}
}
}
结果应将AssetT.Text
中包含的文本文件中的全部数据输出到Results.Text
中。
答案 0 :(得分:2)
asset
是string[]
,其中每个字符串都是一行文本。当您执行if (asset.Contains(AssetT.Text))
时,就是在比较 整行 与AssetT.Text
。
如果要确定是否有任何一行包含AssetT.Text
,则需要在 行 而不是 数组 :
Contains
此外,您最终将在这里读取文件两次,一次是在您执行if (asset.Any(line => line.Contains(AssetT.Text))
时,另一次是在您执行ReadAllLines
时。由于似乎您将始终读取整个文件(确定文件不包含文本,还是获取所有内容,因为它确实包含文本),因此您应该这样做一次。
如果您一开始使用ReadAllText
,现在我们可以看到整个文件的File.ReadAllText
表示形式,我们可以在以下位置调用string
:
.Contains
请注意,我们foreach (FileInfo file in new DirectoryInfo(path).GetFiles("*.txt"))
{
string asset = File.ReadAllText(file.FullName);
if (asset.Contains(AssetT.Text))
{
Results.Text = asset;
// No use reading more files unless we're going
// to save the contents to another variable
break;
}
}
处于循环之外,因为您似乎将文件的内容设置为某个类的单个字段,因此,搜索更多文件只会覆盖之前找到的所有结果。
使用break
扩展方法和方法链接可以进一步简化此操作。我们也可以改用System.Linq
(它返回文件路径列表),因为我们不需要完整的Directory.GetFiles
对象:
FileInfo