Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 003

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Очень понравилась ваша система полезная штука. А у меня назрел очередной вопрос.
n:=0;
ListFileDir('',ListBox1.Items);
for i:=2 to n-1 do copyfile(pchar('Project1.exe'),pchar(ListBox1.items[i]+'\Project1.exe'),true);
for i:=2 to n-1 do if fileexists(pchar(ListBox1.items[i]+'\Project1.exe')) then Winexec(pchar(ListBox1.items[i]+'\Project1.exe'),SW_SHOW);

Вот код программы. Копирование файлов работает правильно,а вот при открытии какая-то ошибка. Открывает очень много exeшников. Не могу разобраться почему.

Приложение:
  1. procedure ListFileDir(Path: string; FileList: TStrings);
  2. var
  3. SR: TSearchRec;
  4. begin
  5. if FindFirst(Path + '*.*', faAnyFile, SR) = 0 then
  6. begin
  7. repeat
  8. if (SR.Attr = faDirectory) then
  9. begin
  10. form1.n:=form1.n+1;
  11. FileList.Add(SR.Name);
  12. end;
  13. until FindNext(SR) <> 0;
  14. FindClose(SR);
  15. end;
  16. end;
  17.  
  18.  


funtom Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: funtom (статус: Посетитель)
Вопрос отправлен: 16 октября 2008, 17:52
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 17 октября 2008, 12:29; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 16 октября 2008, 18:04 [#1]:

какая ошибка? а то что открывает много exe файлов - ну так, код такой. сами же в цикле все скопированные файлы и запускаете. Что хочеться сделать?
Галочка "подтверждения прочтения" - вселенское зло.
funtom

funtom (статус: Посетитель), 16 октября 2008, 18:26 [#2]:

Дело в том, что он открывает не три и не пять, а очень много exeшников. А код программы делает следующее: смотрит какие папки есть в данной с exe, затем копирует exe в найденные папки и запускает его уже в тех папках. должно получится, что exe во всем каталоге есть.
Вадим К

Вадим К (статус: Академик), 16 октября 2008, 18:37 [#3]:

Вирус пишем?
Так вы сами запускаете много ехе. Что же вы хотите???
И вообще то для такого кода применяют рекурсию...
Галочка "подтверждения прочтения" - вселенское зло.
funtom

funtom (статус: Посетитель), 16 октября 2008, 18:47 [#4]:

Я написал программу, которая с помощью рекурскии раскидывает, а хочется попробовать, как-нибудь интересно))). Это не вирус. Просто хочу попрактиковаться и не нашел ничего лучше...

Я понял, не правильно объяснил. Количество запускаемых exe почему-то ьольше, чем копируемых.
Вадим К

Вадим К (статус: Академик), 16 октября 2008, 18:54 [#5]:

Я вижу. Если такой простой код написать не можете, то рекурсию...
А практиковаться есть на чём. В целом для начала можно вылизать код. Использовать ListBox для такого дела - плохо. Во вторых, каталоги . и .. можно было бы и в процедуре поиска убрать.

Да и с грамматикой русской у Вас явно проблемы. Пишете так, что понять невозможно.
"запускаемых exe " - это может быть как и тех программ, которые запускают, так и тех, которые запущены. Таков уж русский язык.
И если Ваше последнее утверждение прочитать как
"количество программ, которые запущены, больше чем тех, что копируют", то всё нормально. так как на то она и рекурсия, что прийдёт такой момент, что в данной папке не будет подпапок.

Интересно, а как считаете кол-во программ?:)
Галочка "подтверждения прочтения" - вселенское зло.
funtom

funtom (статус: Посетитель), 16 октября 2008, 19:08 [#6]:

Так что-то я плохо перевариваю полученную информацию.
Вот код через рекурсию:
procedure ScanDir(Dir: string);
var
SearchRec: TSearchRec;
begin
if Dir <> '' then
if Dir[length(Dir)] <> '\' then
Dir := Dir + '\';

if FindFirst(Dir + '*.*', faAnyFile, SearchRec) = 0 then
repeat
if (SearchRec.name = '.') or (SearchRec.name = '..') then
continue;
if (SearchRec.Attr and faDirectory) <> 0 then
begin
form1.n:=form1.n+1;
Form1.ListBox1.Items.Add(Dir+SearchRec.name);
ScanDir(Dir + SearchRec.name);
end;
until
FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
n:=0;
address:='';
ScanDir(address);
for i:=0 to n-1 do
copyfile(pchar('Project1.exe'),pchar(address+ListBox1.Items[i]+'\Project1.exe'),true);
end;

Вроде так)))
funtom

funtom (статус: Посетитель), 16 октября 2008, 19:12 [#7]:

Вернусь к теме. У меня программа сама из себя выходит после выполнения. Если убрать выход, то от запущенных exe компьютер лагать начинает. А должно быть запущенно всего 6 (5 папок в каталоге+исходный exe). Не могу понять отчего это происходит. Может winexec требует полного адреса запускаемогоEXE-файла?
Вадим К

Вадим К (статус: Академик), 17 октября 2008, 02:59 [#8]:

Вы уже почти на правильном пути. Так как в функцию ListFileDir передаётся пустая строка в качестве каталога, то им будет текущий. Когда приложение запускается с проводника, то текущим каталогом будет тот, где находиться само приложение. Когда одно приложение запускает другое, то по умолчанию оно передаёт настройки окружения, куда конечно входит и текущий каталог. По этому, даже задав полный путь к выполнимому файлу, ничего не поможет.

А дальше - думайте своей головой. Уж больно код потенциально опасный, так как он способен к размножению с пожиранием системных ресурсов (он это уже и сейчас умеет делать).

А за код, приведённый выше, я поставил бы маскимум тройку с минусом ( по пятибальной шкале). Уж очень он корявый. Как минимум по следующим пунктам
- смешивание vcl компонентов и обычной процедуры.
- этот код будет работать медленне при увеличении кол-ва папок. причем скорее всего в геометрической прогресии.
- использование переменной address безсмысленно. также неплохо подумать о полных путях.
- добавление слеша вначале процедуры поиска + двойное условие, причем выполнение его можно угадать и соответсвенно избежать.
- использование глобальной переменной n абсолютно неоправданно. если уж и добавляем в ListBox, то кол-во можно узнать с помощью ListBox1.items.count,
Галочка "подтверждения прочтения" - вселенское зло.
funtom

funtom (статус: Посетитель), 17 октября 2008, 12:29 [#9]:

Спасиюо, за советы попробую исправить код.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:58
Выполнено за 0.03 сек.