25 / 14 / 1
Регистрация: 13.08.2010
Сообщений: 330
1

Как создать список файлов exe по определенному пути

09.12.2013, 01:01. Показов 1820. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите создать список файлов exe по определенному пути. То есть ищу функцию, чтобы
Delphi
1
GetFileList('D:\Downloads\', Memo1.Lines);
и в поле мемо создался список exe файлов?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.12.2013, 01:01
Ответы с готовыми решениями:

DownloadFileAsync - Как сохранять файл по определенному пути?
client.DownloadFileAsync(new Uri("ссылка"),"USERPROFILE/Downloads") Что тут не правильно...

Visual C++ как получить путь к exe, и список файлов , и папок что рядом с ней
Visual C++ как получить путь к exe, и список файлов , и папок что рядом с ней вот #include...

Изменение пути распаковки файлов, находящихся в контейнере, созданном Bat to Exe Converter
Возникла проблема, чтобы при запуске bat конвертированного в exe он запускал другие exe файлы из...

Как создать нумерованный список файлов?
Есть sd карта, которую использую в машине. как можно создать нумерованный список песен, чтобы...

4
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
09.12.2013, 01:17 2
Если надо искать только в заданной папке:
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
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
53
uses
  FileCtrl;
 
//Поиск файлов по заданной маске в папке aPath.
//Если маска не задана, то будет использована маска = '*'.
procedure SearchFiles(const aPath, aMask : string; aSl : TStrings);
var
  Path, Mask : String;
  Sr : TSearchRec;
  Attr : Integer;
begin
  //Добавление в конец строки слеша, если его нет.
  Path := IncludeTrailingPathDelimiter(aPath);
  //Маска.
  if aMask <> '' then
    Mask := aMask
  else
    Mask := '*';
 
  //В текущей папке ищем файлы по заданной маске.
  Attr := faAnyFile - faVolumeID - faDirectory;
  try
    if FindFirst(Path + Mask, Attr, Sr) = 0 then
    repeat
      aSl.Add(Path + Sr.Name);
    until FindNext(Sr) <> 0;
  finally
    FindClose(Sr);
  end;
end;
 
//Диалог поиска файлов.
procedure TForm1.Button1Click(Sender: TObject);
var
  Path : String;
begin
  Path := ExtractFilePath(ParamStr(0));
  //if not SelectDirectory('Выбор папки', '', Path) then
  //  Exit;
  if not SelectDirectory(Path, [sdAllowCreate, sdPerformCreate, sdPrompt], 0) then
    Exit;
  if not DirectoryExists(Path) then begin
    MessageBox(Handle, 'Заданная папка не найдена. Действие отменено.', 'Отмена!',
      MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  //Поиск файлов по заданной маске в указанной папке.
  //Если маска не задана, то в процедуре SearchFiles() будет использована маска = '*'.
  //Маска читается из Edit1.Text.
  Memo1.Clear;
  SearchFiles(Path, Edit1.Text, Memo1.Lines);
end;
2. Если надо искать, начиная с заданной папки (в заданной папке и во всех вложенных папках).
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
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
53
54
55
56
57
58
59
60
61
62
63
64
65
uses
  FileCtrl;
 
//Поиск файлов по заданной маске, начиная с папки aPath.
//Если маска не задана, то будет использована маска = '*'.
procedure SearchFiles(const aPath, aMask : string; aSl : TStrings);
var
  Path, Mask : String;
  Sr : TSearchRec;
  Attr : Integer;
begin
  //Добавление в конец строки слеша, если его нет.
  Path := IncludeTrailingPathDelimiter(aPath);
  //Маска.
  if aMask <> '' then
    Mask := aMask
  else
    Mask := '*';
 
  //В текущей папке ищем файлы по заданной маске.
  Attr := faAnyFile - faVolumeID - faDirectory;
  try
    if FindFirst(Path + Mask, Attr, Sr) = 0 then
    repeat
      aSl.Add(Path + Sr.Name);
    until FindNext(Sr) <> 0;
  finally
    FindClose(Sr);
  end;
 
  //В текущей папке ищем все папки и для каждой из них выполняем рекурсивный вызов.
  Attr := faDirectory;
  try
    if FindFirst(Path + '*', Attr, Sr) = 0 then
    repeat
      if (Sr.Name <> '.') and (Sr.Name <> '..') then
        SearchFiles(Path + Sr.Name, Mask, aSl);
    until FindNext(Sr) <> 0;
  finally
    FindClose(Sr);
  end;
end;
 
//Диалог поиска файлов.
procedure TForm1.Button1Click(Sender: TObject);
var
  Path : String;
begin
  Path := ExtractFilePath(ParamStr(0));
  //if not SelectDirectory('Выбор папки', '', Path) then
  //  Exit;
  if not SelectDirectory(Path, [sdAllowCreate, sdPerformCreate, sdPrompt], 0) then
    Exit;
  if not DirectoryExists(Path) then begin
    MessageBox(Handle, 'Заданная папка не найдена. Действие отменено.', 'Отмена!',
      MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  //Поиск файлов по заданной маске, начиная с указанной папки.
  //Если маска не задана, то в процедуре SearchFiles() будет использована маска = '*'.
  //Маска читается из Edit1.Text.
  Memo1.Clear;
  SearchFiles(Path, Edit1.Text, Memo1.Lines);
end;
0
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
09.12.2013, 01:19 3
Цитата Сообщение от Ralik Посмотреть сообщение
То есть ищу функцию, чтобы
если версия Delphi из XE, то System.IOUtils.TDirectory.GetFiles (пример)
для всех версий, чтобы "по быстрому" через TListBox или FindFirst FindNext и FindClose
пример для TListBox
Delphi
1
2
3
4
5
6
7
8
var
  d: string;
....
  d:= 'D:\Downloads\*.exe';
  ListBox1.Perform(LB_DIR,
                DDL_READWRITE,
                Integer(D));
....
0
25 / 14 / 1
Регистрация: 13.08.2010
Сообщений: 330
09.12.2013, 02:18  [ТС] 4
Спасибо господа за отклики! Сделал так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure GetFileList(const Path: String; List: TStrings);
var
 Rec: TSearchRec;
begin
 if FindFirst(Path + '*.*', faAnyFile, Rec) = 0 then
 
 repeat
   if (Rec.Name = '.') or (Rec.Name = '..') then Continue;
   if (Rec.Attr and faDirectory) <> 0 then
   begin
 
   GetFileList(Path + Rec.Name + '\', List);
   end else
 
    if ExtractFileExt(Rec.Name)='.exe' then List.Add(Path + Rec.Name);
 until FindNext(Rec) <> 0;
 FindClose(Rec);
end;
0
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
09.12.2013, 09:01 5
Решение с FindFirst()/FindNext()/FindClose(), в случае, если надо искать в папке файлы с заданным расширением.
Здесь особенность в том, что не смотря на то, что расширение уже задано в маске, тем не менее, надо выполнять дополнительную проверку расширения. Это нужно делать из-за того, что функции FindFirst()/FindNext() учитывают короткие имена файлов DOS. Например, если ищем по маске '*.exe', то по ней найдутся также файлы с расширением '.executable'. Т. к., такому расширению соответствует короткая версия = '.exe'. Это касается также других расширений.

1. Если надо искать только в заданной папке.
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
26
uses
  FileCtrl;
 
//Поиск файлов по маске '*.exe' в папке aPath.
procedure SearchFiles(const aPath : String; aSl : TStrings);
var
  Path : String;
  Sr : TSearchRec;
  Attr : Integer;
begin
  //Добавление в конец строки слеша, если его нет.
  Path := IncludeTrailingPathDelimiter(aPath);
  
  //В текущей папке ищем файлы по маске '*.exe'.
  Attr := faAnyFile - faVolumeID - faDirectory;
  try
    if FindFirst(Path + '*.exe', Attr, Sr) = 0 then
    repeat
      //Дополнительная проверка расширения.
      if AnsiUpperCase(ExtractFileExt(Sr.Name)) = '.EXE' then
        aSl.Add(Path + Sr.Name);
    until FindNext(Sr) <> 0;
  finally
    FindClose(Sr);
  end;
end;
Здесь ещё надо заметить, что при проверке расширения, следует приводить буквы к верхнему или нижнему регистру. Потому, что регистр букв в Sr.Name может быть разным - он точно такой, какой задан в имени файла на диске.

2. Если искать надо в заданной папке и во всех вложенных папках.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
uses
  FileCtrl;
 
//Поиск файлов по маске '*.exe', начиная с папки aPath.
procedure SearchFiles(const aPath : String; aSl : TStrings);
var
  Path : String;
  Sr : TSearchRec;
  Attr : Integer;
begin
  //Добавление в конец строки слеша, если его нет.
  Path := IncludeTrailingPathDelimiter(aPath);
 
  //В текущей папке ищем файлы по маске '*.exe'.
  Attr := faAnyFile - faVolumeID - faDirectory;
  try
    if FindFirst(Path + '*.exe', Attr, Sr) = 0 then
    repeat
      //Дополнительная проверка расширения.
      if AnsiUpperCase(ExtractFileExt(Sr.Name)) = '.EXE' then
        aSl.Add(Path + Sr.Name);
    until FindNext(Sr) <> 0;
  finally
    FindClose(Sr);
  end;
    
  //В текущей папке ищем все папки и для каждой из них выполняем рекурсивный вызов.
  Attr := faDirectory;
  try
    if FindFirst(Path + '*', Attr, Sr) = 0 then
    repeat
      if (Sr.Name <> '.') and (Sr.Name <> '..') then
        SearchFiles(Path, aSl);
    until FindNext(Sr) <> 0;
  finally
    FindClose(Sr);
  end;
end;
0
09.12.2013, 09:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2013, 09:01
Помогаю со студенческими работами здесь

Как можно одной задачей всему парку по определенному пути скопировать с заменой 2 файлика?
Как можно одной задачей всему парку по определенному пути скопировать с заменой 2 файлика?

Как создать список всех расширений файлов в каталоге
можно ли в bat файле создать список всех расширений файлов в каталоге

Список всех файлов в каталогах, пути к которым указаны в параметрах
Написать bat-файл, который бы выводил на экран список всех файлов в каталогах, пути к которым...

Как создать список всех файлов и папок в данной папке?
Есть только предположение, что нужен модуль DOS, но в описании я не нашёл нужной функции.


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru