C# 从字符串中读取文本,然后使用c对xml文件列表进行比较#
我有一个控制台应用程序,它将读取目录中的所有.txt和.xml文件。在txt文件中,是xml文件的列表。我的应用程序必须读取其中的每个txt文件,然后检查txt文件中列出的xml文件在该目录中是否可用 目录中的文件示例:C# 从字符串中读取文本,然后使用c对xml文件列表进行比较#,c#,C#,我有一个控制台应用程序,它将读取目录中的所有.txt和.xml文件。在txt文件中,是xml文件的列表。我的应用程序必须读取其中的每个txt文件,然后检查txt文件中列出的xml文件在该目录中是否可用 目录中的文件示例: 123_Client_01022013_Summary.txt 123_Client_01022013_File1.xml 123_Client_01022013_File2.xml 123_Client_01022013_Summary.txt的内部是: 123_Clien
123_Client_01022013_Summary.txt
123_Client_01022013_File1.xml
123_Client_01022013_File2.xml
123_Client_01022013_Summary.txt的内部是:
123_Client_01022013_File1.xml
123_Client_01022013_File2.xml
这是我的代码:
var directorypath = @"C:\";
string line;
List<String> txtlist = Directory.GetFiles(directorypath, "*.txt").ToList();
List<String> xmllist = Directory.GetFiles(directorypath, "*.xml").ToList();
foreach (var txt in txtlist)
{
StreamReader file = new StreamReader(txt);
while ((line = file.ReadLine()) != null)
{
foreach (var xml in xmlist)
{
FileInfo fileinfo = new FileInfo(xml);
if (fileinfo.Name == line)
{
break;
}
}
}
}
var directorypath=@“C:\”;
弦线;
List txtlist=Directory.GetFiles(directorypath,*.txt”).ToList();
List xmllist=Directory.GetFiles(directorypath,*.xml”).ToList();
foreach(txtlist中的var txt)
{
StreamReader文件=新的StreamReader(txt);
而((line=file.ReadLine())!=null)
{
foreach(xmlist中的var-xml)
{
FileInfo FileInfo=新文件信息(xml);
if(fileinfo.Name==行)
{
打破
}
}
}
}
这段代码正在工作:检查txt文件中的txt,然后每行检查目录中是否存在该xml
有没有什么方法可以让我的价格便宜一点?我知道我的逻辑似乎是正确的,但我不确定这是否是我能做到的最好的方式。如有任何建议,将不胜感激。提前谢谢 也许您应该首先读取txt文件并获取有效xml文件的列表(因此不要在开始时使用GetFiles创建xmllist),然后单独打开它们。因此,您将不会有O2复杂性(两个嵌套的foreach)。也许您应该首先读取txt文件并获取有效xml文件的列表(因此不要在开始时使用GetFiles创建xmllist),然后单独打开它们。因此,您将不会有O2复杂性(两个嵌套foreach)。使用Linq,您可以执行以下操作:
string[] txtList =
Directory.EnumerateFiles(directorypath, "*.txt")
.SelectMany(f => File.ReadAllLines(f))
.ToArray();
string[] xmlList =
Directory.EnumerateFiles(directorypath, "*.xml")
.Select(f => Path.GetFileName(f))
.ToArray();
// XML files that are listed in .txt files but are not present in the directory
var missingXmlFiles = txtList.Except(xmlList);
// XML files that are present in the directory but not listed in .txt files
var extraXmlFiles = xmlList.Except(txtList);
使用Linq,您可以执行以下操作:
string[] txtList =
Directory.EnumerateFiles(directorypath, "*.txt")
.SelectMany(f => File.ReadAllLines(f))
.ToArray();
string[] xmlList =
Directory.EnumerateFiles(directorypath, "*.xml")
.Select(f => Path.GetFileName(f))
.ToArray();
// XML files that are listed in .txt files but are not present in the directory
var missingXmlFiles = txtList.Except(xmlList);
// XML files that are present in the directory but not listed in .txt files
var extraXmlFiles = xmlList.Except(txtList);
试试这样的
var directorypath = @"C:\";
List<String> txtlist = Directory.GetFiles(directorypath, "*.txt").ToList();
foreach (var textFile in txtlist)
{
using (StreamReader file = new StreamReader(textFile))
{
var xmlFiles = file.ReadToEnd().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
var xmlFilesThatDontExsit = xmlFiles.Where(x => !System.IO.File.Exists(x));
//Do what you want with the files that dont exist
}
}
var directorypath=@“C:\”;
List txtlist=Directory.GetFiles(directorypath,*.txt”).ToList();
foreach(txtlist中的var textFile)
{
使用(StreamReader文件=新的StreamReader(textFile))
{
var xmlFiles=file.ReadToEnd().Split(新字符串[]{Environment.NewLine},StringSplitOptions.RemoveEmptyEntries);
var xmlfilesshattontexsit=xmlFiles.Where(x=>!System.IO.File.Exists(x));
//对不存在的文件执行所需操作
}
}
当然,这假定文本文件中的唯一文件是XML文件(因为未选中该选项)尝试类似的操作
var directorypath = @"C:\";
List<String> txtlist = Directory.GetFiles(directorypath, "*.txt").ToList();
foreach (var textFile in txtlist)
{
using (StreamReader file = new StreamReader(textFile))
{
var xmlFiles = file.ReadToEnd().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
var xmlFilesThatDontExsit = xmlFiles.Where(x => !System.IO.File.Exists(x));
//Do what you want with the files that dont exist
}
}
var directorypath=@“C:\”;
List txtlist=Directory.GetFiles(directorypath,*.txt”).ToList();
foreach(txtlist中的var textFile)
{
使用(StreamReader文件=新的StreamReader(textFile))
{
var xmlFiles=file.ReadToEnd().Split(新字符串[]{Environment.NewLine},StringSplitOptions.RemoveEmptyEntries);
var xmlfilesshattontexsit=xmlFiles.Where(x=>!System.IO.File.Exists(x));
//对不存在的文件执行所需操作
}
}
当然,这假设文本文件中的唯一文件是XML文件(因为没有选中)在考虑其中一条注释后,我最终没有得到XML文件列表,只有XML文件名
List<String> txtlist = Directory.GetFiles(directorypath, "*.txt").ToList();
List<String> xmllist = Directory.GetFiles(directorypath, "*.xml").Select(f => Path.GetFileName(f)).ToList();
foreach (var txt in txtlist)
{
StreamReader file = new StreamReader(txt);
while ((line = file.ReadLine()) != null)
{
foreach (var xml in xmlist)
{
if (xml == line)
{
break;
}
}
}
}
List txtlist=Directory.GetFiles(directorypath,“*.txt”).ToList();
List xmllist=Directory.GetFiles(directorypath,“*.xml”)。选择(f=>Path.GetFileName(f)).ToList();
foreach(txtlist中的var txt)
{
StreamReader文件=新的StreamReader(txt);
而((line=file.ReadLine())!=null)
{
foreach(xmlist中的var-xml)
{
if(xml==行)
{
打破
}
}
}
}
因此,现在在执行foreach循环时,我没有创建
FileInfo
的对象。在考虑其中一条注释后,我最终没有得到xml文件列表,只得到了xml文件名
List<String> txtlist = Directory.GetFiles(directorypath, "*.txt").ToList();
List<String> xmllist = Directory.GetFiles(directorypath, "*.xml").Select(f => Path.GetFileName(f)).ToList();
foreach (var txt in txtlist)
{
StreamReader file = new StreamReader(txt);
while ((line = file.ReadLine()) != null)
{
foreach (var xml in xmlist)
{
if (xml == line)
{
break;
}
}
}
}
List txtlist=Directory.GetFiles(directorypath,“*.txt”).ToList();
List xmllist=Directory.GetFiles(directorypath,“*.xml”)。选择(f=>Path.GetFileName(f)).ToList();
foreach(txtlist中的var txt)
{
StreamReader文件=新的StreamReader(txt);
而((line=file.ReadLine())!=null)
{
foreach(xmlist中的var-xml)
{
if(xml==行)
{
打破
}
}
}
}
因此,现在我在执行foreach循环时不创建
FileInfo
对象。因此,您也不必创建FileInfo
对象,只需调用File.Exists(xmlFilename)
即可,因此,您也不必创建FileInfo
对象,只需调用File.Exists(xmlFilename)
性能差吗?如果没有,不用担心——代码很清楚,很容易理解它在做什么。优化可能会使其更难理解。也就是说,使用静态File.Exists(字符串路径)
可能比在每个循环中创建FileInfo
对象更有效。继续测量这两种方法,我相信你会发现差异可以忽略不计。我不确定性能是否差,但我会尝试一下。谢谢@崔布,我有点困惑。为什么要将FileInfo
替换为File.Exists
?FileInfo
要求每次处理文本文件时为每个xml创建一个对象File.Exists
是一种静态方法,不需要对象创建的开销。您很可能需要处理包含数千个文件的目录