0

我有一个控制台应用程序,它将读取目录中的所有 .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;
            }
        }
    }
}

此代码正在工作:检查 txt 文件中的 txt,然后每一行都会检查该 xml 是否存在于目录中。

有什么办法可以让我做这个更便宜一点吗?我知道我的逻辑似乎是正确的,但我不确定这是否是我能做到的最好方法。任何建议将不胜感激。提前致谢!

4

4 回答 4

2

使用 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);
于 2013-07-11T08:02:46.017 回答
1

也许您应该首先阅读 txt 文件并获取有效 xml 文件的列表(因此不要在 GetFiles 开头创建 xmllist),然后单独打开它们。所以你不会有 O2 复杂性(两个嵌套的 foreach)。

于 2013-07-11T07:59:41.570 回答
0

在考虑其中一条评论后,我最终没有得到 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;
             }
         }
    }
 }

所以现在我不是在创建FileInfo一个 foreach 循环的对象。

于 2013-07-11T08:57:51.763 回答
0

尝试这样的事情

        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
            }
        }

当然,这假设文本文件中的唯一文件是 XML 文件(因为没有检查)

于 2013-07-11T08:03:41.900 回答