| 
| 
 | Вопрос # 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шников. Не могу разобраться почему.
 Приложение:Переключить в обычный режим procedure ListFileDir(Path: string; FileList: TStrings); var   SR: TSearchRec; begin   if FindFirst(Path + '*.*', faAnyFile, SR) = 0 then   begin     repeat       if (SR.Attr = faDirectory) then       begin         form1.n:=form1.n+1;         FileList.Add(SR.Name);       end;     until FindNext(SR) <> 0;     FindClose(SR);   end; end;  
|  |   Вопрос задал: funtom (статус: Посетитель)Вопрос отправлен: 16 октября 2008, 17:52
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 9; последнее сообщение — 17 октября 2008, 12:29; участников в обсуждении: 2. 
|   | Вадим К (статус: Академик), 16 октября 2008, 18:04 [#1]:какая ошибка? а то что открывает много exe файлов - ну так, код такой. сами же в цикле все скопированные файлы и запускаете. Что хочеться сделать? Галочка "подтверждения прочтения" - вселенское зло. |  
|   | funtom (статус: Посетитель), 16 октября 2008, 18:26 [#2]:Дело в том, что он открывает не три и не пять, а очень много exeшников. А код программы делает следующее: смотрит какие папки есть в данной с exe, затем копирует exe в найденные папки  и запускает его уже в тех папках. должно получится, что exe во всем каталоге есть. |  
|   | Вадим К (статус: Академик), 16 октября 2008, 18:37 [#3]:Вирус пишем? Так вы сами запускаете много ехе. Что же вы хотите???
 И вообще то для такого кода применяют рекурсию...
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | funtom (статус: Посетитель), 16 октября 2008, 18:47 [#4]:Я написал программу, которая с помощью рекурскии раскидывает, а хочется попробовать, как-нибудь интересно))). Это не вирус. Просто хочу попрактиковаться и не нашел ничего лучше... 
 Я понял, не правильно объяснил. Количество запускаемых exe почему-то ьольше, чем копируемых.
 |  
|   | Вадим К (статус: Академик), 16 октября 2008, 18:54 [#5]:Я вижу. Если такой простой код написать не можете, то рекурсию... А практиковаться есть на чём. В целом для начала можно вылизать код. Использовать ListBox для такого дела - плохо. Во вторых, каталоги . и .. можно  было бы и в процедуре поиска убрать.
 
 Да и с грамматикой русской у Вас явно проблемы. Пишете так, что понять невозможно.
 "запускаемых exe " - это может быть как и тех программ, которые запускают, так и тех, которые запущены. Таков уж русский язык.
 И если Ваше последнее утверждение прочитать как
 "количество программ, которые запущены, больше чем тех, что копируют", то всё нормально. так как на то она и рекурсия, что прийдёт такой момент, что в данной папке не будет подпапок.
 
 Интересно, а как считаете кол-во программ?
   Галочка "подтверждения прочтения" - вселенское зло. |  
|   | 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 (статус: Посетитель), 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 (статус: Посетитель), 17 октября 2008, 12:29 [#9]:Спасиюо, за советы попробую исправить код. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |