|
Вопрос # 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]:
Спасиюо, за советы попробую исправить код.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|