Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 31.01.2016
Сообщений: 108

Что мешает программе?

26.04.2017, 19:06. Показов 1842. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, ув. форумчане, уж не судите за корявость и неорганизованность кода, как говориться как могу)). Но суть не в этом, хочу сделать программу которая сканирует папки, смотрит в которой есть фото и в последствии конвертирует их(уменьшает размер) и в конце концов создает архив с этими фото. Все работает на ура кроме одного, в конце не меняет имя папки(сразу скажу что это надо для того что бы архиватор мог увидеть папку, так как в ней могут быть символы не для командной строки), говорит что она занята процессом. Почему делаю поиск а не FiliExists, потому что с ним не получается по маске это делать. Вроде освобождаю его(поиск в смысле) но все равно ругается на процесс. Подскажите пожалуйста где ошибка, или что надо поменять. Заранее всем спасибо!
P.S. вот сам код

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
i:integer;
SearchRec  :TSearchRec;
begin
for I := 0 to RichEdit1.Lines.Count - 1 do
if FindFirst(RichEdit1.Lines.Strings[i]+'\*.jpg' , faArchive , SearchRec)=0 then begin
WinExecAndWait32(GetEnvironmentVariable('ffactory')+'FormatFactory "All to JPG" "Max Width 1024 Max Height 768"' + ' "' + RichEdit1.Lines.Strings[i] + '\*.jpg"' + extractfilepath(Application.ExeName)+'format'  ,0);
if CheckBox1.Checked then
MoveDir(extractfilepath(Application.ExeName)+'format\All to JPG\*.jpg', RichEdit1.Lines.Strings[i]);
end;
FindClose(SearchRec);
if CheckBox2.Checked then begin
RenameDir(Edit1.Text, GetFilePath(Edit1.Text)+'\new');
WinExecAndWait32('rar a'+' Dashoguz'+DateToStr(date)+'.rar' + ' ' + GetFilePath(Edit1.Text)+'\new'+' save',0);
RenameDir(GetFilePath(Edit1.Text)+'\new', Edit1.Text);
end;
ShowMessage('Задача выполнена');
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.04.2017, 19:06
Ответы с готовыми решениями:

Что-то в функции мешает запуститься всему <script>. Что же это?
Здравствуйте! Написал такой код: &lt;!DOCTYPE HTML&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset=&quot;utf-8&quot;&gt; &lt;tltle&gt;Вычисление среднего...

Доступ из интернета: что мешает?
Столкнулся с довольно типичной проблемой: не получается подключиться к серверу извне, причем ICMP-сообщения доходят до сервера (смотрел в...

Что-то мешает завершению работы
Windows не может завершить работу, появляется предупреждение: Task Host Windows Сервер задач останавливает фоновые задачи. Куда копать?

23
Модератор
 Аватар для D1973
9902 / 6440 / 2454
Регистрация: 21.01.2014
Сообщений: 27,337
Записей в блоге: 3
30.04.2017, 10:03
Цитата Сообщение от antuanidze Посмотреть сообщение
WinExecAndWait32
а это что за зверь такой?
0
0 / 0 / 0
Регистрация: 31.01.2016
Сообщений: 108
30.04.2017, 10:06  [ТС]
Это функция которая запускает прилодение и ждёт его завершение, после код выполняеться дальше
0
Модератор
 Аватар для D1973
9902 / 6440 / 2454
Регистрация: 21.01.2014
Сообщений: 27,337
Записей в блоге: 3
30.04.2017, 10:21
antuanidze, да это я из названия понял... Откуда Вы ее взяли? как она описана? как она реализована?
0
0 / 0 / 0
Регистрация: 31.01.2016
Сообщений: 108
30.04.2017, 10:26  [ТС]
функцию взял с инета, вот код
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
function WinExecAndWait32(FileName:String; Visibility : integer):integer;
var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
 
 
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName,                      { указатель на строку с командной строкой }
nil,                           { указатель на атрибуты безопасности процесса }
nil,                           { указатель на атрибуты безопасности потока }
false,                         { флаг дескриптора предка }
CREATE_NEW_CONSOLE or          { флаги создания }
NORMAL_PRIORITY_CLASS,
nil,                           { указатель на новый блок среды }
nil,                           { указатель на имя текущего каталога }
StartupInfo,                   { указатель на STARTUPINFO }
ProcessInfo) then Result := -1 { указатель на PROCESS_INF }
else
begin
WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
//GetExitCodeProcess(ProcessInfo.hProcess,Result);
end;
end;
0
Модератор
 Аватар для D1973
9902 / 6440 / 2454
Регистрация: 21.01.2014
Сообщений: 27,337
Записей в блоге: 3
30.04.2017, 10:48
antuanidze, ну вот и ответ Вам... Процесс-то не освобожден после завершения в случае успешного вполнения CreateProcess... Кроме того, почему-то закоментарена строка, которая возвращает результат работ функции в случае успешного выполнения...
Попробуйте раскомментарить эту строку
Delphi
1
//GetExitCodeProcess(ProcessInfo.hProcess,Result);
и после нее написать
Delphi
1
2
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
0
0 / 0 / 0
Регистрация: 31.01.2016
Сообщений: 108
30.04.2017, 11:02  [ТС]
раскомментировал строку, дает ошибку E2033 Types of actual and formal var parameters must be identical, это пол беды, добавил что вы сказали, тот же эффект. Но я все таки не думаю что проблема в этой функции, потому что я пробовал этот код на отдельной кнопки, он работает! Я думаю что проблема именно в поиске файла.
Delphi
1
2
3
RenameDir(Edit1.Text, GetFilePath(Edit1.Text)+'\new');
WinExecAndWait32('rar a'+' Dashoguz'+DateToStr(date)+'.rar' + ' ' + GetFilePath(Edit1.Text)+'\new'+' save',0);
RenameDir(GetFilePath(Edit1.Text)+'\new', Edit1.Text);
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
30.04.2017, 12:30
хочу сделать программу которая сканирует папки, смотрит в которой есть фото и в последствии конвертирует их(уменьшает размер)
Вы хорошо подумали о последствиях такой конвертации? Далеко не каждую фотку можно без потерь по единому шаблону конвертировать. Уж поверьте мне, как человеку этим занимающимся на протяжении уже 15 лет. Последствия такой шаблонной конвертации могут быть необратимы.
0
0 / 0 / 0
Регистрация: 31.01.2016
Сообщений: 108
30.04.2017, 12:33  [ТС]
До качества фото мне нет дела, это меня интересует в последнию очередь. У меня проблема в том что код не работает, вот жто реально трабл!
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
30.04.2017, 12:41
Сталкивался с таким неоднократно. Проблема в несколько грязной работе приложения которое вы запускаете для конвертации. Возникает она в 99% как раз при запуске какого либо приложения аналогичным способом. Единого сценария освобождения захваченной папки я к сожалению не нашел. Как вариант возможно поможет отложенное переименование, т.е. при возникновении ошибки вы помещаете эту операцию в очередь и по истечении некоторого времени пробуете снова это сделать. Почти наверняка у вас это получится когда приложение будет запущено в другой папке.
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
30.04.2017, 14:30
Функцию выполняющую CreateProcess называть как WinExec* как-то криво.
К тому же у вас больше похоже не на запуск программы, а на вызов консольной команды. Есть разница.
0
0 / 0 / 0
Регистрация: 31.01.2016
Сообщений: 108
01.05.2017, 09:45  [ТС]
По крайней мере код работает, запускает программу с ключами которые мне нужны и после закрывает её. Это то мне и надо

Добавлено через 18 часов 34 минуты
попробовал без поиска выполнить код, все проходи на ура, соответственно проблема именно в функции поиска, она после держит папку и не дает ее переименовать. Насколько я понял FindClose(SearchRec) освобождает поиск, но почему то этого не происходит, или надо еще что то добавить? Без поиска тоже нельзя так как фото может находиться на третьем уровне вложенности папки, а если прога добавит в очередь папку второго уровня то там уже все папки пойдут на конвертирование и получится бардак. Что можете предложить еще? Может какую альтернативу определения фото в папки по маске? Заранее спасибо!
0
Модератор
 Аватар для D1973
9902 / 6440 / 2454
Регистрация: 21.01.2014
Сообщений: 27,337
Записей в блоге: 3
01.05.2017, 20:06
Цитата Сообщение от antuanidze Посмотреть сообщение
какую альтернативу определения фото в папки по маске?
Знать бы еще Вашу версию Delphi... В RAD Studio альтернатива есть: TDirectory.GetFiles из модуля IOUtils, но это недоступно в старых версиях (до 2009, если мне склероз не изменяет)
0
0 / 0 / 0
Регистрация: 31.01.2016
Сообщений: 108
02.05.2017, 11:57  [ТС]
У меня делфи 2009, а можно чуть по подробнее про это?
Цитата Сообщение от D1973 Посмотреть сообщение
TDirectory.GetFiles из модуля IOUtils,
Добавлено через 6 минут
Как мне определить есть ли там фото или нет? Просто я про эту функцию нечего не слышал

Добавлено через 43 минуты
Не хочу показаться совсем тупым, но у меня почему то нет IOUtils? Это надо отдельно устанавливать что ли?
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
02.05.2017, 13:01
Нет, не надо. Указываете в uses и все.
Потом можно уже получить массив имен файлов например так:
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
 uses IOUtils, Types;
 
{$R *.dfm}
 
procedure TForm24.FormCreate(Sender: TObject);
const FileMask: Array[0..3] of String = ('*.bmp','*.png','*.gif','*.jpg');
var
  SL: TStringList;
  FL: TStringDynArray;
  FilePath: String;
  i,j: Integer;
begin
 FilePath := ExtractFilePath(ParamStr(0));
 SL := TStringList.Create;
 SL.Add('<html><body>');
 for i := 0 to Length(FileMask) - 1
 do begin
    FL := IOUtils.TDirectory.GetFiles(FilePath, FileMask[i]);
    for j := 0 to Length(FL) - 1
    do SL.Add(Format('<p><a href="%s">%s</a><img src="%s" width="64"></p>', [FL[j],ExtractFileName(FL[j]),FL[j]]));
    end;
 SL.Add('</body></html>');
 SL.SaveToFile(FilePath + 'FileList.htm');
 SL.Free;
end;
0
0 / 0 / 0
Регистрация: 31.01.2016
Сообщений: 108
04.05.2017, 17:37  [ТС]
Цитата Сообщение от Пытливый Посмотреть сообщение
Указываете в uses и все.
Я указывал, но я читал про это, эта функция появилась в делфи 2010, а у меня 2009

Добавлено через 16 секунд
Извините за долгое отсутствие, работы много было.

Добавлено через 1 минуту
Цитата Сообщение от Пытливый Посмотреть сообщение
Потом можно уже получить массив имен файлов например так:
Мне не надо имена файлов, мне надо просто узнать, есть ли там фото или нет и все!
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
04.05.2017, 19:18
Просто узнать есть ли там фото - это из области "сделайте мне красиво" и это никакого отношение к программированию не имеет.
Ничего просто так не бывает, выглядеть может просто, но реализация может взорвать мозг.
В вашем случае необходимо получить имя файла, определится является ли он фото. Не загружая и не анализируя его содержимое, узнать это можно только по его расширению. Графических форматов огромное количество, для каждого авторы придумали свое расширение, поэтому берем только самые популярные. Вот так вот все просто
1
0 / 0 / 0
Регистрация: 31.01.2016
Сообщений: 108
04.05.2017, 20:20  [ТС]
Цитата Сообщение от Пытливый Посмотреть сообщение
получить имя файла, определится является ли он фото
Это по моему должно сработать)) Спасибо за совет буду пробовать!

Добавлено через 26 минут
Цитата Сообщение от antuanidze Посмотреть сообщение
получить имя файла, определится является ли он фото
Пробовал посмотреть как это можно реализовать, нашел только функцию FindFirst. К сожалению именно из-за этого я и создал эту тему, так как функция блокирует папку.
0
Житель Земли
 Аватар для DenNik
3004 / 3025 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
11.05.2017, 15:14
Цитата Сообщение от antuanidze Посмотреть сообщение
так как функция блокирует папку.
FindFirst идет в паре с FindClose, а между ними находится FindNext. возможно FindClose как раз и разблокирует папку. я не проверял
0
11.05.2017, 16:27

Не по теме:

DenNik, что-то у Вас с коннектом... постоянное задвоения постов! Не в укор, просто факт констатирую...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.05.2017, 16:27
Помогаю со студенческими работами здесь

Что мешает человеку бросить пить
интересная статейка

Fotter и два блока. Что мешает ?
Не пойму по какой причине страница увеличивается в длину, а блоки и футер при изменении параметров разметки сбиваются в худшую сторону. ...

SEO спам конкурентов мешает жить. Что делать?
Здравствуйте. Я являюсь администратором нескольких сайтов. Сижу на VDS. Возникла проблема, которую надо решить в кратчайшие...

BSOD что то мешает переустановить драйвера AMD (ATI)
Доброго времени суток! У меня такая проблема.. ноут Lenovo z575.. ATI Radeon HD 6650M.. Во время просмотра видео в интернете иногда...

Что мешает смоделировать мозг человека посредством искусственной нейросети?
Если это возможно, хотелось бы завести отдельную тему, где любители научно-популярной литературы на тему ИИ могли бы задавать вопросы тем,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru