powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Цикл для загрузки настроек из ini
12 сообщений из 12, страница 1 из 1
Цикл для загрузки настроек из ini
    #39467128
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер
По работе понадобилось написать утилиту, которая переносит файлы, которые созданы больше часа назад. Каталогов больше ста, для удобства настройки решил вносить в ini
[1]
source=c:\Temp\1\
target=c:\Temp\1\error\
[2]
source=c:\Temp\2\
target=c:\Temp\2\error\
[3]
source=c:\Temp\3\
target=c:\Temp\3\error\
[4]
source=c:\Temp\4\
target=c:\Temp\4\error\
[5]
source=c:\Temp\5\
target=c:\Temp\5\error\
[U1]
source=c:\Temp\U1\
target=c:\Temp\U1\error\

С секциями,которые являются числами проблем вроде нет:
Код: pascal
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.
procedure TForm1.Button1Click(Sender: TObject);
var
i,s : integer;
fini: TIniFile;
sections: TStringList;
tpath1: string;
tpath2: string;
tpath3: string;
SR: TSearchRec;
List1: TStringList;
s1: string;
myFile: TextFile;
 t1 : TDateTime;
  t3 : TDateTime;
begin
    fini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'init.ini');
    tpath3 := ExtractFilepath(Application.ExeName);
    sections := TStringList.Create;
    fini.ReadSections(sections);
    s:=1;
for i :=1 to (sections.Count)   do
begin                                        
memo1.Lines.Add(fini.ReadString(inttostr(s),'source',''));
memo1.Lines.Add(fini.ReadString(inttostr(s),'target',''));
tpath1:=  fini.ReadString(inttostr(s),'source','');
tpath2:=  fini.ReadString(inttostr(s),'target','');
If FindFirst (tpath1 + '*.txt', faAnyFile, SR) = 0 Then
Repeat
t1 :=  FileDateToDateTime(SR.Time);
t3 :=  (now-1/24);
if  t1 < t3 then
begin
CopyFile (PChar(tpath1 + SR.Name) ,PChar(tpath2 + SR.Name) ,false);
DeleteFile (PChar(tpath1 + SR.Name));
List1 := TStringList.Create;
s1:=DatetimeToStr(now);
AssignFile(myFile,tpath3 + 'log.txt');
Append(myFile);
WriteLn(myFile, s1 +' '+ tpath1 + SR.Name+'  обработан  '+ DateTimeToStr(t1));
memo1.Lines.Add(s1 +' '+ SR.Name+'  обработан  ');
CloseFile(myFile);
List1.Free;
end;
Until FindNext(SR)<>0;
FindClose(sr);
s := s +1 ;
end;
end;



А вот как быть с секцией U1?
...
Рейтинг: 0 / 0
Цикл для загрузки настроек из ini
    #39467134
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Цикл для загрузки настроек из ini
    #39467137
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин, отправилось раньше времени. После чтения секций, их имена в стринглисте, в чем проблема?
...
Рейтинг: 0 / 0
Цикл для загрузки настроек из ini
    #39467142
Igor Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
misha mikeблин, отправилось раньше времени. После чтения секций, их имена в стринглисте, в чем проблема?
Опыта мало
...
Рейтинг: 0 / 0
Цикл для загрузки настроек из ini
    #39467157
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
fini.ReadSections(sections);
for i := 0 to sections.Count-1 do
  memo1.Lines.Add(fini.ReadString(sectios[i], 'source', ''));
...
Рейтинг: 0 / 0
Цикл для загрузки настроек из ini
    #39467186
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar, замени
Код: pascal
1.
2.
If FindFirst (tpath1 + '*.txt', faAnyFile, SR) = 0 Then
  Repeat


на
Код: pascal
1.
2.
If FindFirst (tpath1 + '*.txt', faAnyFile, SR) = 0 Then begin
  Repeat



и

Код: pascal
1.
2.
  Until FindNext(SR)<>0;
  FindClose(sr);


на
Код: pascal
1.
2.
3.
  Until FindNext(SR)<>0;
  FindClose(sr);
end;



Не надо закрывать не начатый поиск. А лучше даже что-то вроде этого, если исключения более чем возможны (т.к. есть использование встроенных функций типа работы с файлами):
Код: pascal
1.
2.
3.
4.
5.
6.
if FindFirst( sr ) = 0 then try
  repeat
  until FindNext( sr );
finally
  FindClose( sr );
end;
...
Рейтинг: 0 / 0
Цикл для загрузки настроек из ini
    #39467195
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(Не реклама) Вот тут есть SDK, эта программа реально может за 10 сек от сканировать диск на 320 гб, и давать живой поиск за долю миллисекунды

http://www.voidtools.com/ru-ru/downloads/


Минусы -нужно что бы другая программа работала в фоне (Но это и не минус, при том что всё работает в реальном времени)



Выдержка текста из их сайта


Как долго длится индексирование файлов?

Everything индексирует только имена файлов и папок, создание базы данных обычно занимает несколько секунд.

Индексирование свежеустановленной Windows 10 (около 120 тыс. файлов) длится около секунды.

Для индексирования миллиона файлов потребуется порядка минуты.
...
Рейтинг: 0 / 0
Цикл для загрузки настроек из ini
    #39467328
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockНе надо закрывать не начатый поиск.Для удобочитаемости всегда использую такую конструкцию
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
LRes := FindFirst(....., sr);
try
  while LRes = 0 do begin
    ...........
    LRes := FindNext(sr);
  end;
finally
  FindClose(sr);
end;

Если посмотреть исходники FindClose(), то можно увидеть, что она предусматривает вызов после пустого FindFirst()
...
Рейтинг: 0 / 0
Цикл для загрузки настроек из ini
    #39467361
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, я для наглядности обычно так пишу:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
if FindFirst( sr ) <> 0 then
  Exit;

try
  repeat
  until FindNext( sr ) <> 0;
finally
  FindClose( sr );
end;


В данном случае просто так не подойдет, т.к. этот цикл внутри большой функции и Exit нельзя.

Про проверку в FindClose знаю, но не люблю рассчитывать на нее. И вообще использую winapi-функции вместо оберток, а в Windows.FindClose такой проверки раньше не было и программа валилась. Не помню уже, или в Win2k, или в XP добавили, но на старых виндах я напарывался, передавая в нее невалидный хэндл.
...
Рейтинг: 0 / 0
Цикл для загрузки настроек из ini
    #39467659
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В итоге сделал так:
Код: pascal
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.
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
fini: TIniFile;
sections: TStringList;
tpath1: string;
tpath2: string;
tpath3: string;
SR: TSearchRec;
List1: TStringList;
s1: string;
myFile: TextFile;
t1 : TDateTime;
t3 : TDateTime;
begin
    fini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'init.ini');
    tpath3 := ExtractFilepath(Application.ExeName);
    sections := TStringList.Create;
    fini.ReadSections(sections);
    //проходим по настройкам, получаем пути
for i :=0 to (sections.Count)-1   do
begin
    memo1.Lines.Add(fini.ReadString(sections[i],'source',''));
    memo1.Lines.Add(fini.ReadString(sections[i],'target',''));
    tpath1:=  fini.ReadString(sections[i],'source','');
    tpath2:=  fini.ReadString(sections[i],'target','');
   // в первом каталоге ищем файлы по условиям
If FindFirst (tpath1 + '*.txt', faAnyFile, SR) = 0 Then
begin
// сравниваем время изменения с текущим минус час
Repeat
    t1 :=  FileDateToDateTime(SR.Time);
    t3 :=  (now-1/24);
if  t1 < t3 then
begin
// если файлы старые - переносим и выводим лог в файл и в мемо
    CopyFile (PChar(tpath1 + SR.Name) ,PChar(tpath2 + SR.Name) ,false);
    DeleteFile (PChar(tpath1 + SR.Name));
    List1 := TStringList.Create;
    s1:=DatetimeToStr(now);
    AssignFile(myFile,tpath3 + 'log.txt');
    Append(myFile);
    WriteLn(myFile, s1 +' '+ tpath1 + SR.Name+'  обработан  '+ DateTimeToStr(t1));
    memo1.Lines.Add(s1 +' '+ SR.Name+'  обработан  ');
    CloseFile(myFile);
    List1.Free;
end;
    Until FindNext(SR)<>0;
    FindClose(sr);
end;
end;
end;

...
Рейтинг: 0 / 0
Цикл для загрузки настроек из ini
    #39467729
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarВ итоге сделал так:


Ты код принципиально не форматируешь, чтобы враги помучились читая ?
...
Рейтинг: 0 / 0
Цикл для загрузки настроек из ini
    #39467737
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiGallemarВ итоге сделал так:


Ты код принципиально не форматируешь, чтобы враги помучились читая ?
Извините, в следующий раз сделаю как надо
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Цикл для загрузки настроек из ini
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]