Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: iskander8 от 24-03-2019, 13:41:09

Название: Рекурсивный обход директории
Отправлено: iskander8 от 24-03-2019, 13:41:09
Здравствуйте знатоки программирования под Autocad.
Появилась интересная задача сделать скрипт обхода директории причем все файлы должны быть сгруппированы под своими директориями так, чтобы можно было сделать отметку чекбокса на директории и все файлы находящиеся в этой папке тоже отметились, раньше такую штуку я видел в инсталяторе microsoft office 2007 там выбираешь целую ветку и чекбокс отмечается синим квадратом, если убрать одну из отметок на файле в этой директории, то квадратик бледнеет, показывая, что не все файлы выбраны. Да и изначально около каждой из директорий стоит плюсик, для ее раскрытия.
 
Вот код который обходит все папки и даже ставит чекбоксы напротив файлов, но это не совсем то, что я описал выше.

Код - C# [Выбрать]
  1. namespace FileTree
  2. {
  3.     public partial class Form1 : Form
  4.     {
  5.  
  6.         string filter = "*.dwg";
  7.         string Root = @"C:\test\"; // Корневая папка
  8.        
  9.         public Form1()
  10.         {
  11.             InitializeComponent();
  12.             this.textBox1.Text = Root;  
  13.         }
  14.  
  15.         private void Form1_Load(object sender, EventArgs e)
  16.         {
  17.             Tree.CheckBoxes = true;    
  18.         }
  19.  
  20.         private void button1_Click(object sender, EventArgs e)
  21.         {
  22.  
  23.         }
  24.  
  25.         private void textBox1_TextChanged(object sender, EventArgs e)
  26.         {
  27.              string GetDir = (sender as TextBox).Text;
  28.             Root = "";
  29.             if (Directory.Exists(GetDir))
  30.                 Root = GetDir;
  31.             SetStatus();
  32.             loadFiles();
  33.             //LoadFolder();
  34.         }
  35.        
  36.         private void LoadFolder() {
  37.             string[] fls = Directory.GetFiles(Root, filter, SearchOption.AllDirectories);
  38.            
  39.             HashSet<string> hs = new HashSet<string>();
  40.             foreach (string f in fls) {
  41.                 hs.Add(Path.GetDirectoryName(f));
  42.             }
  43.             Tree.Nodes.Clear();
  44.    
  45.             foreach (string s in hs) {
  46.                 TreeNode rootloc = Tree.Nodes.Add(s);
  47.                 rootloc.Nodes.Add("111");
  48.                
  49.                 TreeNode lev3 = rootloc.Nodes.Add("222");
  50.                 lev3.Nodes.Add("768768768");  
  51.             }
  52.         }
  53.        
  54.         private bool loadFiles() {
  55.             string[] fls = Directory.GetFiles(Root, filter, SearchOption.AllDirectories);
  56.             foreach (string f in fls) {
  57.                 Tree.Nodes.Add(f);    
  58.             }
  59.  
  60.             return false;
  61.         }
  62.        
  63.         private void SetStatus() {
  64.        
  65.             ok.Enabled = Root != "";
  66.         }
  67.  
  68.         private void Tree_AfterSelect(object sender, TreeViewEventArgs e)
  69.         {
  70.  
  71.         }
  72.     }
  73. }

А вот примерная картинка, правда вместо чекбоксов тут изображения папок, но чтобы смысл задачи был понятен привожу изображения.

(https://i.postimg.cc/TLHP7B80/Dwm-2019-03-24-12-14-26-56.jpg) (https://postimg.cc/TLHP7B80)


(https://i.postimg.cc/47rghGkD/Dwm-2019-03-24-12-18-35-47.jpg) (https://postimg.cc/47rghGkD)

Помогите пожалуйста решить задачу.
Название: Re: Рекурсивный обход директории
Отправлено: avc от 24-03-2019, 13:44:35
А при чем тут Автокад?
Название: Re: Рекурсивный обход директории
Отправлено: iskander8 от 24-03-2019, 14:05:08
Это приложение для автокада. Будет выводить файлы .dwg и их нужно будет проверять на ошибки библиотеками автокада. Ну и дальше с этими (отмеченными) файлами работать.
Название: Re: Рекурсивный обход директории
Отправлено: Александр Ривилис от 24-03-2019, 15:21:46
iskander8,
Прочитай у меня в подписи правило о форматировании кода и соблюдай его!
Название: Re: Рекурсивный обход директории
Отправлено: iskander8 от 24-03-2019, 16:54:04
Простите подлеца, почитал как форматировать код, больше не повторится.
Название: Re: Рекурсивный обход директории
Отправлено: Александр Пекшев aka Modis от 24-03-2019, 18:54:40
Это вопрос из тех, на которые в интернете есть сотни готовых решений. И к автокаду это вообще никак не относится
Я потратил секунд 30 и нашел вот:
Пошаговое руководство. Создание интерфейса в стиле проводника с ListView и TreeView элементов управления с помощью конструктора (https://docs.microsoft.com/ru-ru/dotnet/framework/winforms/controls/creating-an-explorer-style-interface-with-the-listview-and-treeview) (вообще на МСДН статья!)
List Drives and Folders in a TreeView Using C# (https://codehill.com/2013/06/list-drives-and-folders-in-a-treeview-using-c/)
File Explorer using Treeview controller in C# 2.0 (https://www.codeproject.com/Articles/13375/File-Explorer-using-Treeview-controller-in-C-2-0)
An "Explorer-Style" TreeView Control (https://www.codeproject.com/Articles/13097/An-quot-Explorer-Style-quot-TreeView-Control)
и т.д. и т.п.
А все то, что вы описали в топике - это мелочи конкретно вашей реализации. Если вы хотите найти прям готовое решение - то нет. Его точно не будет. Если вы хотите, чтобы вам на форуме его сделали - то нет. Тут прям надо сесть и делать. И никто на форуме этого делать не будет, так как это обычная рутинная задачка и нам своих таких хватает =)
Название: Re: Рекурсивный обход директории
Отправлено: iskander8 от 24-03-2019, 19:26:49
Спасибо, что пнули в нужную сторону, тему можно закрыть.
Название: Re: Рекурсивный обход директории
Отправлено: Александр Ривилис от 24-03-2019, 19:29:26
Спасибо, что пнули в нужную сторону, тему можно закрыть.
Посмотри еще эту дискуссию: https://stackoverflow.com/questions/5478984/treeview-with-checkboxes-in-c-sharp
Название: Re: Рекурсивный обход директории
Отправлено: Владимир Шу от 25-03-2019, 10:11:06
Я бы напомнил, что рекурсивно обходя директории на сервере, можно нарваться на отсутствие прав на чтение из директории (был печальный опыт). Просто нужно об этом помнить и учитывать.