На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Как получить список всех файлов в папке
    Как получить список всех файлов в определённой директории ?
      А в FAQ заходить не пробовали?
        Go to FAQ
          Ошибки в Факе на эту тему. :huh:

          Вот та процедура, что там предлагается:
          ExpandedWrap disabled
            Procedure ScanDir(StartDir: String; Mask:string; List:TStrings);
            { Процедура выводит список директории в список List, начиная с директории, указанной в StartDir. Mask - маска для получения файлов
            Источник delphi.mastak.ru
            © А. Подгорецкий }
            Var SearchRec : TSearchRec;
            Begin
             IF Mask ='' then Mask:= '*.*';
             IF StartDir[Length(StartDir)] <> '\' then StartDir := StartDir + '\';
              IF FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then
               Begin
                Repeat
                   { Чтобы выполнение "не подвисало" }
                 Application.ProcessMessages;
                 IF (SearchRec.Attr and faDirectory) <> faDirectory then
                    List.Add(StartDir + SearchRec.Name) else
                     IF (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then
                   Begin
                     List.Add(StartDir + SearchRec.Name + '\');
                       { Рекурсивный вызов }
                     ScanDir(StartDir + SearchRec.Name + '\',Mask,List);
                   End;
                Until FindNext(SearchRec) <> 0;
                FindClose(SearchRec);
              End; {IF}
            end;


          Ошибка 1:
          ExpandedWrap disabled
                 IF (SearchRec.Attr and faDirectory) <> faDirectory then

          Это еще что за условие? Оно ж ВСЕГДА выполнятся будет.

          Ошибка 2:
          Если задать маску отличную от *.* - то не найдется ни одно вложение в подпапках, так как имена папок тоже фильтрируются по этой маске.
            Цитата Chow @ 27.04.04, 14:52
            Ошибка 1:
            ExpandedWrap disabled
                   IF (SearchRec.Attr and faDirectory) <> faDirectory then

            Это еще что за условие? Оно ж ВСЕГДА выполнятся будет.

            faDirectory - это атрибут директории (типа папка)
            и если в атрибуте присутствует атрибут faDirectory , то такие варианты исключаются...т.е. папки не будут указываться в списке...
              Сори. Тормознул, наверное, малёха. :(
              Тут побитное and, а не логическое, да?
              (в С++ есть разница & и && - соответственно).

              ОК. Ну, а на счет маски? Может тоже все нормально в ФАКЕ - просто я чего-то туплю?... :wacko:
                Цитата Chow @ 27.04.04, 16:08
                Цитата
                Если задать маску отличную от *.* - то не найдется ни одно вложение в подпапках, так как имена папок тоже фильтрируются по этой маске.


                ОК. Ну, а на счет маски? Может тоже все нормально в ФАКЕ - просто я чего-то туплю?... :wacko:

                если задашь маску *.* - то выберутся все файлы из всех папок и подпапок...
                если задашь *.txt, то выберуться только текстовые файлы...ну и т.д.

                сами папки в список не попадут, т.к. мы их отсеяли атрибутом, а маской отсееваем по именам...
                  Есессно получу минус в рейтинге, но в очередной раз удивляет реакция ( во времени) уже не модератора, а администратора Song-а
                  С уважением
                    Vestnik, когда я писал своё сообщение я не видел сообщения Vit'а. Вот в чём секрет.
                      Цитата
                      Song, 27.04.04, 23:50
                      я не видел сообщения Vit'а

                      А можно поподробнее? Почему у вас время ответа такое разное? А не первый раз замечаю, что сообщений друг друга не видите :) Просто интересно.
                        Цитата
                        Генерал, 27.04.04, 18:45
                        если задашь маску *.* - то выберутся все файлы из всех папок и подпапок...
                        если задашь *.txt, то выберуться только текстовые файлы...

                        ... только из ТЕКУЩЕЙ папки.
                        Все файлы из подпапок текущей папки не попадают. Т.к. маска *.txt фильтрирует не только список файлов, но и список папок (папки тоже ш могут иметь расширение).

                        Коротче: постараюсь доделать сам. Просто поднял топик, что-бы обратить внимание на возможную ошибку в ФАКе.
                          Цитата Chow @ 28.04.04, 08:48
                          Цитата
                          Генерал, 27.04.04, 18:45
                          если задашь маску *.* - то выберутся все файлы из всех папок и подпапок...
                          если задашь *.txt, то выберуться только текстовые файлы...

                          ... только из ТЕКУЩЕЙ папки.
                          Все файлы из подпапок текущей папки не попадают. Т.к. маска *.txt фильтрирует не только список файлов, но и список папок (папки тоже ш могут иметь расширение).

                          если встречается папка, то программа вызывает саму себя для этой подпапки и поиск идёт уже в подпапке..вот тут:
                          Цитата

                          { Рекурсивный вызов }
                          ScanDir(StartDir + SearchRec.Name + '\',Mask,List);


                          ...и т.д., пока не просмотрит все подпапки...

                          так что в факе всё прально...
                            Цитата
                            Генерал, 28.04.04, 11:08
                            если встречается папка, то программа вызывает саму себя для этой подпапки и поиск идёт уже в подпапке..вот тут:

                            В том то и дело, что папка НЕ встречается, т.к. не удовлетворяет маску *.txt
                            ExpandedWrap disabled
                              IF FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then

                            Например я задам StartDir = 'C:\Temp\', а Mask = '*.txt'. Процедура найдет все тхт-файлы лишь в папке C:\Temp\. А если в этой папке будут подпапки:
                            C:\Temp\1\
                            C:\Temp\2.txt\
                            C:\Temp\3\
                            то она заглянет лишь в C:\Temp\2.txt\, а C:\Temp\1\ и C:\Temp\3\ пропустит, т.к. они не удовлетворяют условию поиска.
                              сначала анализируется атрибут:
                              Цитата
                              IF (SearchRec.Attr and faDirectory) <> faDirectory then


                              если это не папка (<> faDirectory), то это файл (естесно), и если у него расширение .тхт, то он попадает в список:
                              Цитата
                              List.Add(StartDir + SearchRec.Name


                              если это папка, то выполняется сначала проверка, системная ли это папка:
                              Цитата
                              IF (SearchRec.Name <> '..') and (SearchRec.Name <> '.'


                              если не системная, то программа вызывает саму себя, а в качестве папки задаёт подпапку:
                              Цитата
                              { Рекурсивный вызов }
                              ScanDir(StartDir + SearchRec.Name + '\',Mask,List);


                              ну вот, вроде всё разжевал и по полочкам разложил... :D
                                Цитата
                                Генерал, 28.04.04, 12:19
                                ну вот, вроде всё разжевал и по полочкам разложил...

                                А реально попробовать? :D

                                Самое первое условие не проходит:
                                ExpandedWrap disabled
                                    IF FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then

                                если, например, в папке C:\Temp\ нету ни одного файла, а только подпапки в которых есть уже файлы.
                                  Цитата Chow @ 28.04.04, 12:30
                                  А реально попробовать? :D

                                  вот теперь тебе осталось сесть и реально пробывать...и ответы на свои вопросы найдёшь!
                                  ...можешь есчо книжечку по дельфи почитать...там тоге всё хорошо написано... :D
                                    Это был мой совет вам, на счет попробовать.
                                    Сам я уже давно попробовал - поэтому и поднял топик.
                                      всё работает1
                                      вот уж не поленился, поставил на форму кнопочку и ListBox...
                                      скопировал программку из фака, которую ты выложил...один к одному...
                                      давлю на кнопочку... а в листбоксе - чудо!.... список всех файлов из папки, которую я задал!...ну и из всех попдпапок соответственно! :D
                                        Цитата
                                        Генерал, 28.04.04, 13:53
                                        список всех файлов

                                        А по маске?
                                          Это не ошибка а процедуре, а ошибка в логике того кто использует, он почему то чситает, что по маске *.txt ему должны выдать и другие папки, которые не устраивают это маске. Маска для навигации должна быть *.*, а поиск должен делаться сравнение файлов с маской поиска.

                                          В моем FAQ есть иакая процедура поиск файла по маске во всех папках по маске *.*.
                                          http://podgoretsky.com/ftp/Language/nps/ru.delphi.html#N158
                                            Цитата
                                            Mischka, 28.04.04, 06:05
                                            А можно поподробнее? Почему у вас время ответа такое разное? А не первый раз замечаю, что сообщений друг друга не видите Просто интересно.

                                            Интересно? :)
                                            Да всё просто. Например, прихожу на работу, открываю форум. Там к примеру 10 непрочитанных сообщений. Я их все махом открываю. Потом кто-то приходит, меня напряжёт чем-то либо я переключусь на программу и "увлекусь". Т.е. сообщение открыто в окне без ответов, а в это время на них кто-то отвечает. Потом "оторвусь" от работы, начинаю отвечать, не обновив топики. Вот и всё. :)
                                              Цитата Chow @ 28.04.04, 14:11
                                              Цитата
                                              Генерал, 28.04.04, 13:53
                                              список всех файлов

                                              А по маске?

                                              Chow!
                                              Сделай вот так:
                                              Цитата

                                              Procedure ScanDir(StartDir,Mask: String; List: TStrings);
                                              Var SearchRec: TSearchRec;
                                              Begin
                                              IF Mask=''then Mask:='*.*';
                                              IF StartDir[Length(StartDir)]<>'\'then StartDir := StartDir + '\';
                                              // Сначала находим и печатаем все файлы из
                                              // главной папки по маске Mask
                                              List.Add(StartDir);
                                              IF FindFirst(StartDir+Mask,faAnyFile,SearchRec)=0 then Repeat
                                              IF(SearchRec.Attr and faDirectory)<>faDirectory then
                                              List.Add(StartDir+SearchRec.Name);
                                              Until FindNext(SearchRec)<>0;
                                              // Теперь находим все подпапки и продолжаем в них поиск
                                              IF FindFirst(StartDir+'*.*',faAnyFile,SearchRec)=0 then Repeat
                                              IF((SearchRec.Attr and faDirectory)=faDirectory)and
                                              ((SearchRec.Name<>'..')and(SearchRec.Name <> '.'))then
                                              ScanDir(StartDir+SearchRec.Name+'\',Mask,List);
                                              Until FindNext(SearchRec)<>0;
                                              FindClose(SearchRec);
                                              end;


                                              и будет тебе счастье! :rolleyes:
                                                Коды в FAQ - это не библиотека, которую можно бездумно подключить и использовать, это только направление в котором думать надо. Простейший пошаговый проход кода с просмотром на каждой строки переменных легко решает все Ваши вопросы. Люди старались попридумывали в Дельфи клавиши - F7, F8, Shift-F7, Ctrl-F5, Ctrl-F7, F4 - вот и надо их использовать, развели демагогию на десяток топиков - а ведь тот код преобразовать под свои нужды работа минут на 10, да разбираться в нём не фиг делать, достаточно ПРОСТО ПОШАГОВО ЕГО ВЫПОЛНИТЬ!
                                                  Vit, полностью согласен.
                                                  Так и сделал с самого начала. Тем более, что я итак переводил все на С++, так что не разобравшись - сделать было бы такой перевод трудно. А поднял топик потому, что подумал что в коде из ФАКа была ошибка (оказалось не ошибка, а я просто криво на С++ перевел :)) и... вообще потом пожалел что поднял... :)
                                                  1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                  0 пользователей:


                                                  Рейтинг@Mail.ru
                                                  [ Script execution time: 0,0535 ]   [ 15 queries used ]   [ Generated: 15.07.25, 10:03 GMT ]