Как реализовать дерево каталогов (Treeview) и файлов (ListView) из текстового файла?

Прошу помощи в реализации следующей задачи.

Программа "Агент" (установленная на клиентском компьютере) с помощью рекурсивного метода поиска файлов по маске в текстовый файл записывает следующую информацию и передает ее программе "Администратор":
Кликните здесь для просмотра всего текста

c:\HP Universal Print Driver\pcl5-x64-6.1.0.20062\hpfx64bulk.sysD-37-E7-E3-9D-9D-E3-C5-CD-DB-8C-8D-2F-95-F7-6B
c:\HP Universal Print Driver\pcl5-x64-6.1.0.20062\hpfx64gen.sys;25-BE-ED-5E-07-05-79-9D-B3-41-DF-0B-DC-0E-CE-D5
c:\HP Universal Print Driver\pcl5-x64-6.1.0.20062\hppdbulkio.sys;EB-94-07-08-6A-31-A7-E7-4B-F9-E9-01-C8-4F-A1-D3
c:\HP Universal Print Driver\pcl5-x64-6.1.0.20062\hppdgenio.sysE-C4-C0-7F-D5-0F-A6-0E-0D-7C-A9-E6-80-F0-B6-2D
c:\HP Universal Print Driver\pcl5-x64-6.1.0.20062\Install.exe;8B-68-BF-F1-D7-19-C2-4A-BF-70-50-3D-4E-98-FC-D3

В программе "Администратор" файл подгружается в treeview и listview. В данный момент реализована загрузка дерева каталогов в treeview.
Необходимо реализовать подгрузку данных в listview. То есть я выбираю в treeview каталог "pcl5-x64-6.1.0.20062" и в listview попадают все файлы которые есть в этом каталоге. Как бы оффлайн проводник.
В какую сторону копать?
Сохранять в xml я думаю не поможет. так как например файл содержащий 600 000 записей такого формата как выше весит размером в 116 Мб.
  • Вопрос задан
  • 1776 просмотров
Пригласить эксперта
Ответы на вопрос 2
devspec
@devspec
Помогло? Отметь решением
Если файл содержит 600 тысяч записей, то запихнуть его в TreeView или ListView целиком будет крайне затруднительно.
Лучше в этом случае делать подгрузку информации "on demand" - по клику на узле дерева считывается из источника и подгружается только та информация, которая нужна. Если принципиальным вопросом является чтение из заранее подготовленного файла - то этот файл лучше запихнуть в БД (можно даже SQLite), сохранив признаки дерева и построив необходимые индексы для более быстрого чтения, и читать информацию непосредственно из БД - опять же только ту, которая соответствует выбранному узлу.
Если вопрос заранее подготовленного файла не принципиален - тогда лучше 'on demand" запускать алгоритм сканирования файловой системы с подгрузкой в дерево соответствующих результатов.
Надеюсь, понятно объяснил.
Ответ написан
Комментировать
@sedoi_starik Автор вопроса
Вот решил вот так вот свой вопрос.
private void button1_Click(object sender, EventArgs e)
        {
            OpenFilesToTreeView(@"d:\123.txt", treeView1);
        }


Функция открытия файла
public void OpenFilesToTreeView (string NameFiles, TreeView treeview)
        {
            string lineFile;
            string[] tmplineFile;
            FileStream file1 = new FileStream(NameFiles, FileMode.Open);
            using (StreamReader readerFiles = new StreamReader(file1))
            {
                while ((lineFile = readerFiles.ReadLine()) != null)
                {
                    tmplineFile = new[] { lineFile };
                    BuildTree(treeview.Nodes, tmplineFile);
                }
            }
        }

Функция заполнения TreeView
private void BuildTree(TreeNodeCollection nodes, string[] list)
        {
            foreach (var path in list)
            {
                var childs = nodes;
                var pathAndFile = path.Split(';')[0];
                var parts = pathAndFile.Split('\\');
                for (int i = 0; i < parts.Length - 1; i++)
                {
                    childs = FindOrCreateNode(childs, parts[i]).Nodes;
                }
            }
        }
 
        private TreeNode FindOrCreateNode(TreeNodeCollection coll, string name)
        {
            var found = coll.Find(name.ToLower(), false);
            if (found.Length > 0) return found[0];
            return coll.Add(name.ToLower(), name);
        }

Функция заполнения ListView по клику дерева
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            listView1.Items.Clear();
            string lineFile;
            string[] tmplineFile;
            string tmpPath;
            string[] tmpFiles;
            string FullPathTree = e.Node.FullPath.ToString() + "";
            //string tmpFullPath = e.Node.FullPath.ToString() + "";
            FileStream file1 = new FileStream(@"d:\123.txt", FileMode.Open);
            using (StreamReader readerFiles = new StreamReader(file1))
            {
 
                while ((lineFile = readerFiles.ReadLine()) != null)
                {
                    tmplineFile = new[] { lineFile };
                    foreach (string path in tmplineFile)
                    {
                        tmpPath = path.Split(';')[0];
                        if (FullPathTree.TrimEnd() == tmpPath.ToString().TrimEnd())
                        {
                            tmpFiles =  path.Split(';');
                            string[] col = { tmpFiles[1], tmpFiles[2],  tmpFiles[3], tmpFiles[4]};
                            var listview = new ListViewItem(col);
                            listView1.Items.Add(listview);
                        }
                    }
                }
            }
        }


Ну и формат текстового файла
c:\Windows\System32\;test.dll;Size;Date;CheckSumm
c:\Windows\System32\;test1.dll;Size;Date;CheckSumm
c:\Windows\System32\;test2.dll;Size;Date;CheckSumm
c:\Windows\System\;test1.dll;Size;Date;CheckSumm
c:\Windows\System\;test2.dll;Size;Date;CheckSumm
c:\Windows\System\;test3.dll;Size;Date;CheckSumm
c:\Windows\System\;test4.dll;Size;Date;CheckSumm
c:\Windows\Temp\;wtest1.dll;Size;Date;CheckSumm
c:\Windows\Temp\;wtest2.dll;Size;Date;CheckSumm
c:\Windows\Temp\;atest3.dll;Size;Date;CheckSumm
c:\Windows\Temp\;stest4.dll;Size;Date;CheckSumm
c:\Windows\System32\;test3.dll;Size;Date;CheckSumm
c:\Windows\System32\;test4.dll;Size;Date;CheckSumm
c:\Windows\System32\;test5.dll;Size;Date;CheckSumm
c:\Windows\System32\;test6.dll;Size;Date;CheckSumm
c:\Windows\System32\;test7.dll;Size;Date;CheckSumm
c:\Windows\System32\;test8.dll;Size;Date;CheckSumm
c:\Windows\System32\;test9.dll;Size;Date;CheckSumm
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы