Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/34: Рейтинг темы: голосов - 34, средняя оценка - 4.50
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
.NET 4.x

Показ список файлов из определенных папок

26.11.2017, 22:00. Показов 7336. Ответов 80
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Короче идея такая. Есть некоторые виды папок
DATA
Campaigns
Downloads Maps
Multiplayer Maps
Single Maps
Battle Tutorial
Town Tutorial

Есть checkedListBox со списком этих файлов

Есть ListBox в котором нужно показать файлы из этих папок.

Весь прикол в том что эти папки необязательно должны лежать в корне и нужно также искать файлы в подпапках этих папок.

Но также известно что файлы которые нужно отобразить могут находится только в этих папках.
Как сделать так чтобы можно было управлять отображаемыми файлами в ListBox

У меня есть идея использовать под каждую папку отдельный list<string> но тогда не получится использовать BindingSource для отображения. Может у кого есть эффективный способ отображать имена файлов из папок выбранных в checkedListBox
Также еще хотелось к List перекрутить свойство возвращать от полного имени только имя файла.

И да. Узнать хочу может использовать FileInfo для этих целей так как эти файлы не только отображать нужно. В listBox их нужно будет выбирать для их дальнейшей загрузки редактирования и сохранения.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.11.2017, 22:00
Ответы с готовыми решениями:

Распаковка определённых папок/файлов из 7z (JEDI)
Есть функция - распаковывает полностью архив, а нужно что бы только опредёлённые папки и файлы: function Decompress(FileName, DestDir:...

Удаление файлов и папок в сетевом обмене, кроме определенных
Доброго времени суток друзья, есть сетевая папка для обмена файлами между пользователями нашего учреждения, со временем она забивается и её...

Копирование нескольких определённых файлов и папок в одну определённую папку
Уважаемые форумчане мне нужен скрипт копирования папок и определенных файлов. Мне нужно скопировать 3 папки расположенных в разным местах...

80
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
01.12.2017, 11:09  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Usaga Посмотреть сообщение
Заблокировать контрол не куча кода. Сложности в этом нет. Лучше изначально стараться делать всё корректно. И не экономить на таких моментах.
Ну видишь ли контрол эта форма на которой храниться те элементы которые отвечают за поиск и те которыми можно пользоваться. Хотя можно схитрить и исползовать панель для этого. Ладно.
Короче можнешь поэтапно объяснить как релизовать. И пример на патоки скинуть. А то именно с патоками я както не владах.Не знаю вроде бы и не так сложно но в памяти почемуто не остается.
0
Эксперт .NET
 Аватар для Usaga
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,117
01.12.2017, 11:23
Alexandr_7, вы сначала без потоков, с тормозами сделайте. А то вы ещё прошлую задачу не решили. Про потоки сначала прочитайте соответствующую главу в учебнике, а потом уже примеры просите, иначе это всё будет бесполезно.
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
03.12.2017, 12:24  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Alexandr_7, вы сначала без потоков, с тормозами сделайте. А то вы ещё прошлую задачу не решили. Про потоки сначала прочитайте соответствующую главу в учебнике, а потом уже примеры просите, иначе это всё будет бесполезно.
Если бы я знал как это сделать я это сделал бы.
Короче на данный момент поиск идет вот так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
private List<ExtendedFileInfo> FindFiles(string path, string searchPattern, SearchOption searchOption)
        {
            Stack<string> dirs = new Stack<string>();
            dirs.Push(path);
 
            List<ExtendedFileInfo> aList = new List<ExtendedFileInfo>();
 
            while (dirs.Count > 0)
            {
                string currentDirPath = dirs.Pop();
                if (searchOption == SearchOption.AllDirectories)
                {
                    try
                    {
                        string[] subDirs = Directory.GetDirectories(currentDirPath);
                        foreach (string subDirPath in subDirs)
                        {
                            dirs.Push(subDirPath);
                        }
                    }
                    catch (UnauthorizedAccessException)
                    {
                        continue;
                    }
                    catch (DirectoryNotFoundException)
                    {
                        continue;
                    }
                }
 
                string[] files = null;
                try
                {
                    files = Directory.GetFiles(currentDirPath, searchPattern);
                }
                catch (UnauthorizedAccessException)
                {
                    continue;
                }
                catch (DirectoryNotFoundException)
                {
                    continue;
                }
 
                foreach (string filePath in files)
                {
                    aList.Add(new ExtendedFileInfo(filePath));
                }
            }
 
            return aList;
        }
Ее надо переделать не только возвращаемым значением но и чтобы прогресс поиска показывался на прогресс баре чтобы знать сколько он будет длится а от зависания если файлов много скажем 1000 или больше то тут все равно будет задержка поиска да и это от пк еще зависит точнее от ЦП и оперативки.
0
Эксперт .NET
 Аватар для Usaga
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,117
03.12.2017, 12:37
Alexandr_7, чтобы можно было показать прогрессбар нужно знать сколько файлов всего. Чтобы узнать сколько файлов всего - нужно выполнить поиск)

Гуглите применение класса Task. Его использование тривиально. Заблокируете UI и в другом потоке запустите писк файлов.
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
03.12.2017, 13:43  [ТС]
Не ну объясните ккакой метод поиска должен быть. Таск это отвечает за поиск в другом потоке но сам метод поиска нужно переделать

Добавлено через 1 минуту
Ах да Версия Net - 4.0
0
Эксперт .NET
 Аватар для Usaga
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,117
03.12.2017, 13:47
Что значит "какой метод поиска должен быть"? Какой вам надо, такой и делайте. Прогрессбар показать не получится по причинам описанным выше. А сам поиск лучше производить при выборе соответствующих пунктов, а не заранее. Это всё, что я могу посоветовать.

Добавлено через 49 секунд
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Ах да Версия Net - 4.0
И что?
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
03.12.2017, 14:54  [ТС]
Тогда не понятно как прикрутить Task к методу поиска и что метод поиска должен возвращать
Например идея следущая. Сделать поиск который будет заносить файлы в лист и при удачном занесении возвращать истину. Это 1 вопрос и не понятно только одно. Что использовать лучше Ref или Out для листинга. По идеи элементы листа использоваться не будут за исключением его очистка. Туда лишь будут добавлятся файлы
2 Вопросок к слову перед методом поиска надо сначало разобраться со списком Файлов.
И класс ExtendedFileInfo нужно переделать хотя по идеи он не нужен ведь в списке имена файлов будут хранится в таком виде:
text.{0}.libx
А не в
text.eng.libx где eng это язык.

Не по теме:

И вообще. Я думаю зря я вздумал писать утилиту на C# Причина следующая:
Игра для которой я пишу утилиту пишется на Delphi пишется не мной и использования некоторых обработчиков например получения списка локализаций не надо делать велосипед как это я делал в C# достаточно использовать методы игры
Другое дело как сохранять и загружать данные класса а в Delphi для этого достаточно Record'а я не знаю. Точнее там нужно каждый тип данных писать отдельно нежели в c# достаточно серилизовать весь класс
Также я не знаю аналога BindingSource для Delphi но в любом сдучае для другого проекта (если его конечно можно назвать проектом так как я не пишу с нуля а скорее исправляю и усовершенствую то что и так написано было) мне необходимо просто найти аналог BindingSource. На данный момент в другом проекте в Campaign Builder способ обнавления данных в ListView

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TForm1.UpdateList;
var
  I, K: Integer;
  N, SN: TTreeNode;
begin
  fUpdating := True;
 
  tvList.Items.Clear;
 
  for I := 0 to C.MapCount - 1 do
  begin
    N := tvList.Items.AddChild(nil, C.CampName + ' mission ' + IntToStr(I + 1));
    if fSelectedMap = I then
      N.Selected := True;
 
    for K := 0 to C.Maps[I].NodeCount - 1 do
    begin
      SN := tvList.Items.AddChild(N, 'node ' + IntToStr(K + 1));
      if (fSelectedMap = I) and (fSelectedNode = K) then
        SN.Selected := True;
    end;
  end;
 
  fUpdating := False;
end;
Как видно сначала он стирается потом заново создается. Не правильно ведь при штук 60 миссий и 30 нодов в каждой миссии лагает.
Тоесть мы добавляем или убираем 1 миссию или нод и весь список обновляется путем очистки и занового создания элементов.

0
Эксперт .NET
 Аватар для Usaga
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,117
03.12.2017, 15:20
Alexandr_7, проблема не в C# и не в Delphi. Проблема в том, что программирование не ваша стезя. Вообще. Я бы рекомендовал вам вообще оставить эту затею и другим чем-то заняться. Оно вам не даётся. Вы уже четыре страницы не можете получить сраный список файлов. Это вообще ни в какие ворота.

Я больше не вижу смысла вам что-то советовать. Планомерное изучение используемых вами инструментов для вас нонсенс. Метод тыка - ваше всё.

Когда дозреете до банального прочтения учебника по C#, тогда можно будет пообщаться.

Не по теме:

P.S. Перед изучением C# рекомендую прочитать учебник по Русскому языку хотя бы класс за седьмой, чтобы глаза не кровоточили при чтении ваших постов.



Доброго дня.
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
03.12.2017, 15:48  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Alexandr_7, проблема не в C# и не в Delphi. Проблема в том, что программирование не ваша стезя. Вообще. Я бы рекомендовал вам вообще оставить эту затею и другим чем-то заняться. Оно вам не даётся. Вы уже четыре страницы не можете получить сраный список файлов. Это вообще ни в какие ворота.
Я больше не вижу смысла вам что-то советовать. Планомерное изучение используемых вами инструментов для вас нонсенс. Метод тыка - ваше всё.
Когда дозреете до банального прочтения учебника по C#, тогда можно будет пообщаться.
Не по теме:
P.S. Перед изучением C# рекомендую прочитать учебник по Русскому языку хотя бы класс за седьмой, чтобы глаза не кровоточили при чтении ваших постов.
Доброго дня.
Во первых то что некоторое освоить в C# я не могу не значит что оно мне не доется.
Второе. Если уж не хранить весь список файлов в программе а при каждом снаятии или поставки галки то идея здес следущая:
Отдельный список. При каждом И изменении галки стирать его и заново добавлять найденые файлы.
А уже сам список связывать с listFilesLibx
Выже мне предлагаете список файлов хранить SourceDirectoryItem
А я говорю что нельзя так. Ведь DirLibxName это массив классов SourceDirectoryItem и хранится он в классе Конфиг который сериализуется в XML формат.
Так что нельзя список хранить SourceDirectoryItem так как сам список с файлами будет тоже записываться в конфиг.
Если только перед тем как конфиг записать не обнулить список.
Но я не совсем уверен что правильным решением будет хранить список в SourceDirectoryItem но видимо что верным.
Ладно впрос решили. Буду делать по вашим советам.

Добавлено через 5 минут
А на счет обнуления списка. Предположим что DirLibxName равен массиву 100 элементов SourceDirectoryItem
И что перед закрытием чтобы обнулить список в каждом элементе DirLibxName да прога тупо может зависнуть. Закрытие должно быть моментальным. Тогда прийдется делать отдельный поток котррый обнулит данные, Сохранит а потом и сам себя закроет. Поток должен быть отдельно от программы чтобы программу можно было закрыть. Вы как всегда скажите что делать это через Task но вот я еще не сталкивался в том чтобы делать поток работающий отдельно от проги в данном случае утилите. К томуже некоторые антивирусники будут данный способ считать вирусом.
0
Эксперт .NET
 Аватар для Usaga
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,117
04.12.2017, 06:42
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Выже мне предлагаете список файлов хранить SourceDirectoryItem
Я это не предлагаю, уже третий раз вам повторяю. Я предлагаю композицию такого вида:

C#
1
2
3
4
5
class DirectoryItem
{
    public SourceDirectoryItem DirectoryItem { get; set; }
    public FileInfo[] Files { get; set; }
}
Надеюсь теперь ясно?
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
04.12.2017, 09:39  [ТС]
И как его использовать. Тоесть вы предлагаете 2 штуки DirLibxName создать
1 в конфиге а второй в классе формы. Ну и приравнивать
DirLibxNameF.DirectoryItem = Config.DirLibxName;
Если нет то не понял вас?
0
Эксперт .NET
 Аватар для Usaga
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,117
04.12.2017, 09:45
Alexandr_7, это просто невероятно.

Я предлагаю связывать с CheckListBox не класс SourceDirectoryItem, а ввести другой, DirectoryItem (к примеру, можно назвать как угодно, лишь бы суть отражало название), в который запихнуть как сведения о директориях (SourceDirectoryItem) так и файлы найденные в них). И использовать этот новый класс.

Т.е. вы не трогаете свой драгоценный SourceDirectoryItem, он как нёс данные из настроек, так и продолжает это делать. Вы объединяете всё что нужно в другом классе и его подвязываете к контролам.
0
04.12.2017, 10:28

Не по теме:

Цитата Сообщение от Usaga Посмотреть сообщение
это просто невероятно.:wall:
И так в каждой его теме :popcorn:

0
04.12.2017, 10:30

Не по теме:

Rius, я такого выдающегося человека впервые встречаю... Т.е. бывали несообразительные, но чтобы настолько...

0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
07.12.2017, 04:27  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Т.е. вы не трогаете свой драгоценный SourceDirectoryItem, он как нёс данные из настроек, так и продолжает это делать. Вы объединяете всё что нужно в другом классе и его подвязываете к контролам.
Тогда вопрос следующем. Как в новом классе добавить данные класса SourceDirectoryItem
0
Эксперт .NET
 Аватар для Usaga
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,117
07.12.2017, 04:41
Alexandr_7, что? Это на полном серьёзе спрошено? Или вы меня троллите?
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
09.12.2017, 17:41  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Alexandr_7, что? Это на полном серьёзе спрошено? Или вы меня троллите?
Ну если вот так к примеру класс в конфиге
C#
1
2
3
4
5
6
7
8
9
public SourceDirectoryItem[] DirLibxName =
            {
                new SourceDirectoryItem (){ Caption = "Tutorials - Battle Tutorial", Dir = "Tutorials\\Battle Tutorial\\" },
                new SourceDirectoryItem (){ Caption = "Tutorials - Town Tutorial", Dir = "Tutorials\\Town Tutorial\\" },
                new SourceDirectoryItem (){ Caption = "Campaigns", Dir = "Campaigns\\" },
                new SourceDirectoryItem (){ Caption = "Single Maps", Dir = "Maps\\" },
                new SourceDirectoryItem (){ Caption = "Multiplayer Maps", Dir = "MapsMP\\" },
                new SourceDirectoryItem (){ Caption = "Downloads Maps", Dir = "MapsDL\\" }
            };
При этом удобный метод записи и чтения путем серилизации. Он позволит добавить новые данные прям в файле XML что не прейдется обновлять экзешник ради добавления новых данных
Вот по твоим словам я понял что нужно создать отдельный класс
C#
1
2
3
4
5
6
7
class CDirectoryItem
{
    public SourceDirectoryItem DirectoryItem { get; set; }
    public FileInfo[] Files { get; set; }
}
 
CDirectoryItem[] DirectoryItem;
Так вот я только знаю этот способ присвоить данные из DirLibxName в DirectoryItem
C#
1
2
3
4
5
6
DirectoryItem = new CDirectoryItem[Config.DirLibxName.Length];
DirectoryItem.DirectoryItem = new 
for(int i = 0; i < Config.DirLibxName.Length; i++)
{
DirectoryItem[i].DirectoryItem = Config.DirLibxName[i];
}
Есть теоретический а именно
C#
1
DirectoryItem = Config.DirLibxName;
Который точно не сработает.
Но способ что я показал не эфективен.
0
Эксперт .NET
 Аватар для Usaga
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,117
10.12.2017, 08:51
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Но способ что я показал не эфективен.
Правда что ли?) И в чём это выражается?)
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
01.01.2018, 00:16  [ТС]
Не имеет значения. Данную утилиту я пишу на Delphi по причине того что
Есть такое свойство у игры обновлятся. Если писать на C# то тут и нельзя кодом игры воспользоваться. Все с нуля. И бесконца следить за изменениями. Так что по данным причинам решил переписать с нуля на Delphi
0
Эксперт .NET
 Аватар для Rius
13827 / 7899 / 1707
Регистрация: 25.05.2015
Сообщений: 23,978
Записей в блоге: 14
01.01.2018, 00:31
И как же вы кодом игры пользуетесь, в процессе написания программы на дельфи?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.01.2018, 00:31

Удалить все папки и файлы кроме определенных 2 папок и 2 файлов
Нужна помощь профессионалов ! Борюсь со скриптом bat Надо удалить все папки и файлы кроме определенных 2 папок и 2 файлов Вообщум...

Удаление определённых файлов из профильных папок пользователей, имена которых заранее неизвестны
Приветствую. Настигла такая проблема. У юзверей есть на рабочих столах некоторый ярлык. И ладно бы он лежал в All Users, так иногда этот...

Список папок и файлов
Задача: сделать вывод папок и файлов в этих папках. &lt;? $handle = opendir('.'); $i = 0; print(&quot;Files:...

Список файлов и папок
Столкнулся с проблемой что данная система не выводит файлы в самой папке, то есть если в папке &quot;c:\test&quot; есть файлы , он их не...

Получаем список файлов и папок
Господа, Форумчане! Хочу получить список файлов и папок допусти моей флешки (раздел G:\) вот код, почему то не все файлы и папки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru