быстрый поиск XML-файла в каталоге и подкаталоге для миллионов данных в C # - PullRequest
0 голосов
/ 25 сентября 2019

как быстро искать в 100 папках каталога данных.Вот пример окна URL

    D:\DataDirectory\DataDirectory1\Product
    D:\DataDirectory\DataDirectory1\PB
    ....
    D:\DataDirectory\DataDirectory145\Product
    D:\DataDirectory\DataDirectory145\PB
    D:\DataDirectory\DataDirectory146\Product
    D:\DataDirectory\DataDirectory146\PB
    D:\DataDirectory\DataDirectory147\Product
    D:\DataDirectory\DataDirectory147\PB

Вот пример данных partNo в папке

    -Folder Product (contains 122867 items)
    D:\DataDirectory\DataDirectory145\Product\149329762 000007.xml
    D:\DataDirectory\DataDirectory145\Product\149329762 000031.xml
    ....
    D:\DataDirectory\DataDirectory145\Product\149329762 000090.xml
    D:\DataDirectory\DataDirectory145\Product\149329762 000114.xml


    -Folder PWB (contains 125794 items)
    D:\DataDirectory\DataDirectory145\PB\149329762M0000007.xml
    D:\DataDirectory\DataDirectory145\PB\149329762M0000090.xml
    ....
    D:\DataDirectory\DataDirectory145\PB\149329762M0000104.xml
    D:\DataDirectory\DataDirectory145\PB\149329762M0000199.xml

Это для поиска partNo в папке DataDirectory.Я попытался выполнить поиск partNo в папке DataDirectory только для 6 папок

    DataDirectory132, 
    DataDirectory143,
    DataDirectory145,
    DataDirectory146,
    DataDirectory147,
    DataDirectory2

, но для завершения поиска требуется 8 минут.Не включайте поиск в 147 папках и получайте файл данных.Я новичок в c #

Вот код, который я пробовал

    private void Button1_Click(object sender, EventArgs e)
    {
        try
        {
            string partNo = cmbPartNo.SelectedItem.ToString();
            string searchPartNo = "*" + partNo + "*";
            Console.WriteLine("searchPartNo = " + searchPartNo);
            string dirPath = @"D:\DataDirectory";

            // LINQ query.
            var dirs = from dir in Directory.EnumerateDirectories(dirPath,"DataDirectory*", SearchOption.TopDirectoryOnly)
                     select dir;


            // Show results.
            foreach (var dir in dirs)
            {
                 string[] subDirs = Directory.GetFiles(dir, searchPartNo, SearchOption.AllDirectories);
                 Console.WriteLine("subDirs = " + subDirs.Length);
                 // Remove path information from string.
                 Console.WriteLine("{0}",
                 dir.Substring(dir.LastIndexOf("\\") + 1));
            }

            Console.WriteLine("{0} directories found.",
            dirs.Count<string>().ToString());

            // Optionally create a List collection.
            List<string> workDirs = new List<string>(dirs);
        }
        catch (UnauthorizedAccessException UAEx)
        {
             Console.WriteLine(UAEx.Message);
        }
        catch (PathTooLongException PathEx)
        {
             Console.WriteLine(PathEx.Message);
        }
    }

введите описание изображения здесь

1 Ответ

0 голосов
/ 25 сентября 2019

В прошлом году я написал следующий код, и мне было любопытно, насколько быстрее он выполняется, чем ваш код.Мой код создает одну папку за раз, используя TopDirectoryOnly вместо AllDirectories.Я подозреваю, что поиск по всей папке замедляет код.

Для сравнения вы можете не захотеть записывать в выходной файл test.xml.Я бы положил выходной файл в другую папку, а не там, где находятся ваши XML-файлы.Код рекурсивно проходит по каждой папке и записывает все имя файла и информацию о файле в выходной файл.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;

namespace WriteFileNamesXml
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        const string FOLDER = @"c:\temp";
        static XmlWriter writer = null;
        static void Main(string[] args)
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;

            writer = XmlWriter.Create(FILENAME, settings);
            writer.WriteStartDocument(true);

            DirectoryInfo info = new DirectoryInfo(FOLDER);
            WriteTree(info);

            writer.WriteEndDocument();
            writer.Flush();
            writer.Close();


        }
        static long WriteTree(DirectoryInfo info)
        {
            long size = 0;
            writer.WriteStartElement("Folder");
            try
            {
                writer.WriteAttributeString("name", info.Name);
                writer.WriteAttributeString("numberSubFolders", info.GetDirectories().Count().ToString());
                writer.WriteAttributeString("numberFiles", info.GetFiles().Count().ToString());
                writer.WriteAttributeString("date", info.LastWriteTime.ToString());


                foreach (DirectoryInfo childInfo in info.GetDirectories())
                {
                    size += WriteTree(childInfo);
                }

            }
            catch (Exception ex)
            {
                string errorMsg = string.Format("Exception Folder : {0}, Error : {1}", info.FullName, ex.Message);
                Console.WriteLine(errorMsg);
                writer.WriteElementString("Error", errorMsg);
            }

            FileInfo[] fileInfo = null;
            try
            {
                fileInfo = info.GetFiles();
            }
            catch (Exception ex)
            {
                string errorMsg = string.Format("Exception FileInfo : {0}, Error : {1}", info.FullName, ex.Message);
                Console.WriteLine(errorMsg);
                writer.WriteElementString("Error", errorMsg);
            }

            if (fileInfo != null)
            {
                foreach (FileInfo finfo in fileInfo)
                {
                    try
                    {
                        writer.WriteStartElement("File");
                        writer.WriteAttributeString("name", finfo.Name);
                        writer.WriteAttributeString("size", finfo.Length.ToString());
                        writer.WriteAttributeString("date", info.LastWriteTime.ToString());
                        writer.WriteEndElement();
                        size += finfo.Length;
                    }
                    catch (Exception ex)
                    {
                        string errorMsg = string.Format("Exception File : {0}, Error : {1}", finfo.FullName, ex.Message);
                        Console.WriteLine(errorMsg);
                        writer.WriteElementString("Error", errorMsg);
                    }
                }
            }

            writer.WriteElementString("size", size.ToString());
            writer.WriteEndElement();
            return size;

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...