Форум программистов, компьютерный форум, киберфорум
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. Показов 7099. Ответов 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
14577 / 9479 / 1360
Регистрация: 21.01.2016
Сообщений: 35,759
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
14577 / 9479 / 1360
Регистрация: 21.01.2016
Сообщений: 35,759
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
14577 / 9479 / 1360
Регистрация: 21.01.2016
Сообщений: 35,759
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
14577 / 9479 / 1360
Регистрация: 21.01.2016
Сообщений: 35,759
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
14577 / 9479 / 1360
Регистрация: 21.01.2016
Сообщений: 35,759
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
14577 / 9479 / 1360
Регистрация: 21.01.2016
Сообщений: 35,759
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
14577 / 9479 / 1360
Регистрация: 21.01.2016
Сообщений: 35,759
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
14577 / 9479 / 1360
Регистрация: 21.01.2016
Сообщений: 35,759
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
13391 / 7846 / 1699
Регистрация: 25.05.2015
Сообщений: 23,855
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru