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 の複雑さはありません (2 つのネストされた foreach)。

于 2013-07-11T07:59:41.570 に答える
0

Try something like this

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

Of course this assumes that the only files in the Text file are XML files (as that is not checked)

于 2013-07-11T08:03:41.900 に答える