Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从字符串中读取文本,然后使用c对xml文件列表进行比较#_C# - Fatal编程技术网

C# 从字符串中读取文本,然后使用c对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

我有一个控制台应用程序,它将读取目录中的所有.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_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
是一种静态方法,不需要对象创建的开销。您很可能需要处理包含数千个文件的目录