Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/30: Рейтинг темы: голосов - 30, средняя оценка - 4.67
2 / 2 / 1
Регистрация: 22.09.2012
Сообщений: 189

Поиск и копирование файлов

06.10.2012, 19:01. Показов 6439. Ответов 40

Студворк — интернет-сервис помощи студентам
1. открытие диалогового окна "Выбор файла" (или дирректории) (в 1 месте дирректорию, в другом файл)
2. копирование пути выбранного файла в Edit.Text и реестр (файл надо сделать в эдит, дирректорию в реестр)
3. по нажатию кнопки поиск в выбранной дирректории файлов с выбранными форматоми и раскладка по папкам в соответствии с типом

если точнее пытаюсь написать нечто вроде патчера, в котором надо выбрать при первом запуске дирректорию установки (возможно в дальнейшем изменение) и сохранить ее в реестр для дальнейшего использовани. дальше выбирается предположительно скачанная папка (в ней какие то файлы разных форматов) или (желательно конечно, если это не очень сложно) архив (zip\rar) так вот там проводится поиск каких то заданных типов файлов, и допустим нашли 1.txt и положили в дир. установки в папку "моя папка\txt files\" что то типа того и так с остальными типами файлов...
помогите пжл с этими 3 пунктами

п.с. еще просто практически не изучал работу с файлами в делфи =)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.10.2012, 19:01
Ответы с готовыми решениями:

Поиск, отслеживание и копирование всех файлов в каталоге
Доброе время суток, ребята может кто поможет или сделает программу которая сначала поищет всех файлов в указанной папке и будет следить за...

Поиск и копирование файлов, перебирая все доступные диски
Всем доброго времени суток. Сегодня я столкнулся с проблемой что перед тем как переустановить виндоус нужно скачать все важные файлы в...

Поиск и копирование файлов. Incompatible types: 'TSearchRec' and 'PAnsiChar'
procedure TForm1.Button1Click(Sender: TObject); Var SR:TSearchRec; FindRes:Integer; prog : string; NameFolder : string;...

40
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
08.10.2012, 00:12
Студворк — интернет-сервис помощи студентам
Это надо будет в процедуру CopyFolder() добавить ещё один параметр - через него будет передаваться ссылка на экземпляр TIniFile. И в теле CopyFolder() будет происходить запись нужных файлов в INI файл.
Сейчас напишу, как это будет выглядеть...
---
В общем, я вот таким образом пока прикрутил ini файл.
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
uses
  FileCtrl, IniFiles;
 
type
  TInfo = record
    IniFile : TIniFile;
    SecName, RootPath : String; //Имя секции в ini файле и корень в целевом пути.
  end;
 
//Процедура копирует структуру папок из aPath1 в папку aPath2.
//И копирует файлы, соответствующие маске aMask.
//Если aMask = '', то маска принимается равной '*'.
procedure CopyFolder(const aPath1, aPath2, aMask : String; aInfo : TInfo);
const
  SelfName = 'CopyFolder()';
var
  Srd, Srf : TSearchRec;
  AttrD, AttrF : Integer;
  Path1, Path2, Mask, RelPath, S : String;
begin
  //Проверка путей.
  Path1 := aPath1;
  Path2 := aPath2;
  if Path1 = '' then
    raise Exception.Create(SelfName + '. Не задан путь к исходной папке.');
  if not DirectoryExists(Path1) then
    raise Exception.Create(SelfName + '. Путь к исходной папке не найден.');
  if Path2 = '' then
    raise Exception.Create(SelfName + '. Не задан путь к целевой папке.');
  //Добавление завершающего слеша в пути.
  Path1 := IncludeTrailingPathDelimiter(Path1);
  Path2 := IncludeTrailingPathDelimiter(Path2);
  //Маска имён файлов.
  Mask := aMask;
  if Mask = '' then Mask := '*';
  //Значение атрибутов, которое может соответствовать папкам.
  AttrD := faAnyFile - faVolumeID;
  //Значение атрибутов, соответствующее любым файлам, исключая тома и папки.
  AttrF := faAnyFile - faVolumeID - faDirectory;
 
  //Создаём целевую папку.
  ForceDirectories(Path2);
  //Определяем относительный путь. Это нужно для записи в ini файл.
  RelPath := Copy(Path2, Length(aInfo.RootPath) + 1, Length(Path2));
 
  //Перебор файлов, согласно маске.
  try
    if FindFirst(Path1 + Mask, AttrF, Srf) = 0 then
    repeat
      S := 'Нет';
      //На случай, если не надо перезаписывать уже существующие файлы.
      //if not FileExists(Path2 + Srf.Name) then begin
      if CopyFile(PChar(Path1 + Srf.Name), PChar(Path2 + Srf.Name), False) then
        S := 'Да';
      //end;
      //Для файлов с определёнными расширенями заносим сведения в ini файл.
      //Например, выполняем такую запись для файлов с расширением '.TXT'.
      if AnsiUpperCase( ExtractFileExt(Srf.Name) ) = '.TXT' then
        aInfo.IniFile.WriteString(aInfo.SecName, RelPath + Srf.Name, S);
    until FindNext(Srf) <> 0;
  finally
    FindClose(Srf);
  end;
 
  //Перебор всех папок.
  try
    if FindFirst(Path1 + '*', AttrD, Srd) = 0 then
    repeat
      //Если текущий объект является папкой и такая папка не является ссылкой
      //на саму себя '.' или на папку вышестоящего уровня '..', то выполняем
      //для неё рекурсивный вызов.
      if ( Srd.Attr and faDirectory = faDirectory )
        and (Srd.Name <> '.') and (Srd.Name <> '..')
      then
        CopyFolder(Path1 + Srd.Name, Path2 + Srd.Name, aMask, aInfo);
    until FindNext(Srd) <> 0;
  finally
    FindClose(Srd);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Mask, Path1, Path2 : String;
  Info : TInfo;
begin
  //Исходный путь.
  Path1 := Edit1.Text;
  //Целевой путь.
  Path2 := Edit2.Text;
  //Маска имён файлов.
  Mask := Edit3.Text;
 
  Path2 := IncludeTrailingPathDelimiter(Path2);
  ForceDirectories(Path2);
 
  //Создаём или открываем ini файл.
  Info.IniFile := TIniFile.Create(Path2 + 'data.ini');
  //Имя секции в виде текущего момента даты и времени.
  Info.SecName := FormatDateTime('dd.mm.yyyy"-"hh.nn.ss', Now);
  //Корневая папка.
  Info.RootPath := Path2;
  //Копирование.
  try
    CopyFolder(Path1, Path2, Mask, Info);
  finally
    FreeAndNil(Info.IniFile);
  end;
end;
В результате, в ini файл записывается информация подобного вида:
Code
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
53
54
55
56
57
58
59
60
61
62
63
[08.10.2012-00.01.24]
01.txt=Да
02.txt=Да
03.txt=Да
04.txt=Да
01\01.txt=Да
01\02.txt=Да
01\03.txt=Да
01\04.txt=Да
01\01\01.txt=Да
01\01\02.txt=Да
01\01\03.txt=Да
01\01\04.txt=Да
02\01.txt=Да
02\02.txt=Да
02\03.txt=Да
02\04.txt=Да
02\01\01.txt=Да
02\01\02.txt=Да
02\01\03.txt=Да
02\01\04.txt=Да
[08.10.2012-00.02.36]
01.txt=Да
02.txt=Да
03.txt=Да
04.txt=Да
01\01.txt=Да
01\02.txt=Да
01\03.txt=Да
01\04.txt=Да
01\01\01.txt=Да
01\01\02.txt=Да
01\01\03.txt=Да
01\01\04.txt=Да
02\01.txt=Да
02\02.txt=Да
02\03.txt=Да
02\04.txt=Да
02\01\01.txt=Да
02\01\02.txt=Да
02\01\03.txt=Да
02\01\04.txt=Да
[08.10.2012-00.07.24]
01.txt=Да
02.txt=Да
03.txt=Да
04.txt=Да
01\01.txt=Да
01\02.txt=Да
01\03.txt=Да
01\04.txt=Да
01\01\01.txt=Да
01\01\02.txt=Да
01\01\03.txt=Да
01\01\04.txt=Да
02\01.txt=Да
02\02.txt=Да
02\03.txt=Да
02\04.txt=Да
02\01\01.txt=Да
02\01\02.txt=Да
02\01\03.txt=Да
02\01\04.txt=Да
Т. е., для файлов с заданным расширением в ini файл записываются сведения об относительном пути и имени файла. И сведения о том скопирован файл или нет: =Да/Нет.
0
2 / 2 / 1
Регистрация: 22.09.2012
Сообщений: 189
08.10.2012, 00:39  [ТС]
ух еле осилил... вопросы:
1. если я удалю 101 строку ничего ведь не будет? =) (не нужна такая... только имена с расширениями)
2. если в 99 строке Info.IniFile := TIniFile.Create(Path2 + 'data.ini'); заменю на Info.IniFile := TIniFile.Create('data.ini'); то уберется путь в ини файле перед именами так ведь? или как то по другому его убрать можно? (тоже не нужен...)
3. с 5 по 9 строки где это писать? в глобальные переменные? (до {$R *.dfm} или после?) у меня что там что там выдает ошибку: Unit 'FileCtrl' is specific to a platform.
4. и еще не нужно добавлять да везде... тоже как убрать? нужны чисто имена файлов с расширениями больше ничего
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
08.10.2012, 01:20
Цитата Сообщение от Илья Панов Посмотреть сообщение
1. если я удалю 101 строку ничего ведь не будет? =) (не нужна такая... только имена с расширениями)
Имя секции тогда можно вообще убрать из структуры TInfo и везде в коде, где это поле использовалось.
Цитата Сообщение от Илья Панов Посмотреть сообщение
2. если в 99 строке Info.IniFile := TIniFile.Create(Path2 + 'data.ini'); заменю на Info.IniFile := TIniFile.Create('data.ini'); то уберется путь в ини файле перед именами так ведь? или как то по другому его убрать можно? (тоже не нужен...)
Нет, это не здесь надо убирать. В 45 строке надо написать:
Delphi
1
RelPath := '';
И в дальнейшем вообще RelPath убрать из программы.
Цитата Сообщение от Илья Панов Посмотреть сообщение
3. с 5 по 9 строки где это писать? в глобальные переменные? (до {$R *.dfm} или после?)
Можно так написать:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
implementation
 
{$R *.dfm}
 
uses
  FileCtrl, IniFiles;
 
type
  TInfo = record
    IniFile : TIniFile;
    SecName, RootPath : String; //Имя секции в ini файле и корень в целевом пути.
  end;
...
Цитата Сообщение от Илья Панов Посмотреть сообщение
у меня что там что там выдает ошибку: Unit 'FileCtrl' is specific to a platform.
Это предупреждение - что этот модуль зависит от платформы. Имеется в виду, что средства FileCtrl применимы только под Windows.
FileCtrl теперь надо убрать из USES. - Его средства уже не используются в программе.
Цитата Сообщение от Илья Панов Посмотреть сообщение
4. и еще не нужно добавлять да везде... тоже как убрать? нужны чисто имена файлов с расширениями больше ничего
В классическом ini файле такое невозможно. Все ключи в таком файле должны иметь вид:
Code
1
<ключ>=<значение>
Если требуется отклониться от этого правила, тогда придётся отказаться от использования TIniFile и выполнять запись в обыкновенный текстовый файл. Можно предварительно записывать в экземпляр TStringList. А потом сохранять в файл через вызов TStringList.SaveToFile().
И если сохранять только имя файла без относительного пути, тогда может возникнуть путаница - в случае, если, в разных папках есть файлы с одинаковым именем.
---
С учётом поправок новый заголовок процедуры CopyFolder() можно сделать таким:
Delphi
1
procedure CopyFolder(const aPath1, aPath2, aMask : String; aLog : TStrings);
Здесь через параметр aLog будет передаваться ссылка на экземпляр любого потомка класса TSrtings - например экземпляр TStringList или TMemo.Lines, TListBox.Items и т. д.
В aLog будет вестись запись имён файлов. Потом можно сделать сохранение через вызов aLog.SaveToFile().
0
2 / 2 / 1
Регистрация: 22.09.2012
Сообщений: 189
08.10.2012, 01:34  [ТС]
1.
Имя секции тогда можно вообще убрать из структуры TInfo и везде в коде, где это поле использовалось.
во 2 часу ночи уже туго соображаю... а как это сделать?...
2.
И в дальнейшем вообще RelPath убрать из программы.
уберите пжл))
3.
FileCtrl теперь надо убрать из USES
а сам написал его... убрал а он мне пишет что uses незнает что это =) (Declaration expected but 'USES' found) в глобальных переменных убирать?
4.
Если требуется отклониться от этого правила, тогда придётся отказаться от использования TIniFile и выполнять запись в обыкновенный текстовый файл. Можно предварительно записывать в экземпляр TStringList. А потом сохранять в файл через вызов TStringList.SaveToFile().
И если сохранять только имя файла без относительного пути, тогда может возникнуть путаница - в случае, если, в разных папках есть файлы с одинаковым именем.
---
С учётом поправок новый заголовок процедуры CopyFolder() можно сделать таким:Код Delphi
1 procedure CopyFolder(const aPath1, aPath2, aMask : String; aLog : TStrings);


Здесь через параметр aLog будет передаваться ссылка на экземпляр любого потомка класса TSrtings - например экземпляр TStringList или TMemo.Lines, TListBox.Items и т. д.
В aLog будет вестись запись имён файлов. Потом можно сделать сохранение через вызов aLog.SaveToFile().
сори уже совсем туплю... ничего не понял... мне не нужен txt мне нужен ini и чтобы пользователю при этом никаких лишних диалогов не выдавало... без разницы работает так ini или нет, я только знаю что прога которая будет юзать этот ini файл использует его когда в нем строки в виде "имя.формат" все больше там ничего нет и быть не должно... и файл при этом должен быть ini...

п.с. все спаааать...
0
angstrom
08.10.2012, 02:02
Цитата Сообщение от Mawrat Посмотреть сообщение
В классическом ini файле такое невозможно. Все ключи в таком файле должны иметь вид:
Code
1
<ключ>=<значение>
Пусть тогда изменит на
[08.10.2012-00.01.24]
file1=01.txt
file2=02.txt
file3=03.txt
file4=04.txt
file5=01\01.txt
...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var
  I : Integer;
begin
...
  I := 0;
  //Перебор файлов, согласно маске.
  try
    if FindFirst(Path1 + Mask, AttrF, Srf) = 0 then
    repeat
      //На случай, если не надо перезаписывать уже существующие файлы.
      //if not FileExists(Path2 + Srf.Name) then begin
      CopyFile(PChar(Path1 + Srf.Name), PChar(Path2 + Srf.Name), False);
      //end;
      //Для файлов с определёнными расширенями заносим сведения в ini файл.
      //Например, выполняем такую запись для файлов с расширением '.TXT'.
      inc(I);
      if AnsiUpperCase( ExtractFileExt(Srf.Name) ) = '.TXT' then
        aInfo.IniFile.WriteString(aInfo.SecName, Format('File%d', [I]), RelPath + Srf.Name);
    until FindNext(Srf) <> 0;
  finally
    FindClose(Srf);
  end;
...
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
08.10.2012, 02:06
Следующая версия.
1.
Если всё-таки требуется запись в ini файл относительных путей:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
implementation
 
{$R *.dfm}
 
type
  TInfo = record
    Log : TStrings;
    RootPath : String; //Корень в целевом пути.
  end;
 
//Процедура копирует структуру папок из aPath1 в папку aPath2.
//И копирует файлы, соответствующие маске aMask.
//Если aMask = '', то маска принимается равной '*'.
procedure CopyFolder(const aPath1, aPath2, aMask : String; aInfo : TInfo);
const
  SelfName = 'CopyFolder()';
var
  Srd, Srf : TSearchRec;
  AttrD, AttrF : Integer;
  Path1, Path2, Mask, RelPath : String;
  Res : Boolean;
begin
  //Проверка путей.
  Path1 := aPath1;
  Path2 := aPath2;
  if Path1 = '' then
    raise Exception.Create(SelfName + '. Не задан путь к исходной папке.');
  if not DirectoryExists(Path1) then
    raise Exception.Create(SelfName + '. Путь к исходной папке не найден.');
  if Path2 = '' then
    raise Exception.Create(SelfName + '. Не задан путь к целевой папке.');
  //Добавление завершающего слеша в пути.
  Path1 := IncludeTrailingPathDelimiter(Path1);
  Path2 := IncludeTrailingPathDelimiter(Path2);
  //Маска имён файлов.
  Mask := aMask;
  if Mask = '' then Mask := '*';
  //Значение атрибутов, которое может соответствовать папкам.
  AttrD := faAnyFile - faVolumeID;
  //Значение атрибутов, соответствующее любым файлам, исключая тома и папки.
  AttrF := faAnyFile - faVolumeID - faDirectory;
 
  //Создаём целевую папку.
  ForceDirectories(Path2);
  //Определяем относительный путь. Это нужно для записи в журнал.
  RelPath := Copy(Path2, Length(aInfo.RootPath) + 1, Length(Path2));
 
  //Перебор файлов, согласно маске.
  try
    if FindFirst(Path1 + Mask, AttrF, Srf) = 0 then
    repeat
      (*
      Res := False;
      //На случай, если не надо перезаписывать уже существующие файлы.
      if not FileExists(Path2 + Srf.Name) then begin
      *)
      //Копирование.
      Res := CopyFile(PChar(Path1 + Srf.Name), PChar(Path2 + Srf.Name), False);
      //end;
      //Для файлов с определёнными расширенями заносим сведения в журнал.
      //Например, выполняем такую запись для файлов с расширением '.TXT'.
      if (aInfo.Log <> nil) and Res
        and (AnsiUpperCase( ExtractFileExt(Srf.Name) ) = '.TXT')
      then
        aInfo.Log.Add(RelPath + Srf.Name);
    until FindNext(Srf) <> 0;
  finally
    FindClose(Srf);
  end;
 
  //Перебор всех папок.
  try
    if FindFirst(Path1 + '*', AttrD, Srd) = 0 then
    repeat
      //Если текущий объект является папкой и такая папка не является ссылкой
      //на саму себя '.' или на папку вышестоящего уровня '..', то выполняем
      //для неё рекурсивный вызов.
      if ( Srd.Attr and faDirectory = faDirectory )
        and (Srd.Name <> '.') and (Srd.Name <> '..')
      then
        CopyFolder(Path1 + Srd.Name, Path2 + Srd.Name, aMask, aInfo);
    until FindNext(Srd) <> 0;
  finally
    FindClose(Srd);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Mask, Path1, Path2 : String;
  Info : TInfo;
begin
  //Исходный путь.
  Path1 := Edit1.Text;
  //Целевой путь.
  Path2 := Edit2.Text;
  //Маска имён файлов.
  Mask := Edit3.Text;
 
  Path2 := IncludeTrailingPathDelimiter(Path2);
  ForceDirectories(Path2);
 
  //Создаём журнал.
  Info.Log := TStringList.Create;
  //Корневая папка.
  Info.RootPath := Path2;
  //Копирование.
  try
    CopyFolder(Path1, Path2, Mask, Info);
  finally
    Info.Log.SaveToFile(Info.RootPath + 'log.ini');
    FreeAndNil(Info.Log);
  end;
end;
 
end.
2.
С записью в ini файл имён файлов без относительных путей. Напомню - в этом случае, если в разных папках есть файлы с одинаковыми именами, то сведения о них запишутся в ini файл в виде одинаковых строк.
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
implementation
 
{$R *.dfm}
 
//Процедура копирует структуру папок из aPath1 в папку aPath2.
//И копирует файлы, соответствующие маске aMask.
//Если aMask = '', то маска принимается равной '*'.
procedure CopyFolder(const aPath1, aPath2, aMask : String; aLog : TStrings);
const
  SelfName = 'CopyFolder()';
var
  Srd, Srf : TSearchRec;
  AttrD, AttrF : Integer;
  Path1, Path2, Mask : String;
  Res : Boolean;
begin
  //Проверка путей.
  Path1 := aPath1;
  Path2 := aPath2;
  if Path1 = '' then
    raise Exception.Create(SelfName + '. Не задан путь к исходной папке.');
  if not DirectoryExists(Path1) then
    raise Exception.Create(SelfName + '. Путь к исходной папке не найден.');
  if Path2 = '' then
    raise Exception.Create(SelfName + '. Не задан путь к целевой папке.');
  //Добавление завершающего слеша в пути.
  Path1 := IncludeTrailingPathDelimiter(Path1);
  Path2 := IncludeTrailingPathDelimiter(Path2);
  //Маска имён файлов.
  Mask := aMask;
  if Mask = '' then Mask := '*';
  //Значение атрибутов, которое может соответствовать папкам.
  AttrD := faAnyFile - faVolumeID;
  //Значение атрибутов, соответствующее любым файлам, исключая тома и папки.
  AttrF := faAnyFile - faVolumeID - faDirectory;
 
  //Создаём целевую папку.
  ForceDirectories(Path2);
 
  //Перебор файлов, согласно маске.
  try
    if FindFirst(Path1 + Mask, AttrF, Srf) = 0 then
    repeat
      (*
      Res := False;
      //На случай, если не надо перезаписывать уже существующие файлы.
      if not FileExists(Path2 + Srf.Name) then begin
      *)
      //Копирование.
      Res := CopyFile(PChar(Path1 + Srf.Name), PChar(Path2 + Srf.Name), False);
      //end;
      //Для файлов с определёнными расширенями заносим сведения в журнал.
      //Например, выполняем такую запись для файлов с расширением '.TXT'.
      if (aLog <> nil) and Res
        and (AnsiUpperCase( ExtractFileExt(Srf.Name) ) = '.TXT')
      then
        aLog.Add(Srf.Name);
    until FindNext(Srf) <> 0;
  finally
    FindClose(Srf);
  end;
 
  //Перебор всех папок.
  try
    if FindFirst(Path1 + '*', AttrD, Srd) = 0 then
    repeat
      //Если текущий объект является папкой и такая папка не является ссылкой
      //на саму себя '.' или на папку вышестоящего уровня '..', то выполняем
      //для неё рекурсивный вызов.
      if ( Srd.Attr and faDirectory = faDirectory )
        and (Srd.Name <> '.') and (Srd.Name <> '..')
      then
        CopyFolder(Path1 + Srd.Name, Path2 + Srd.Name, aMask, aLog);
    until FindNext(Srd) <> 0;
  finally
    FindClose(Srd);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Mask, Path1, Path2 : String;
  Log : TStringList;
begin
  //Исходный путь.
  Path1 := Edit1.Text;
  //Целевой путь.
  Path2 := Edit2.Text;
  //Маска имён файлов.
  Mask := Edit3.Text;
 
  Path2 := IncludeTrailingPathDelimiter(Path2);
  ForceDirectories(Path2);
 
  //Создаём журнал.
  Log := TStringList.Create;
  //Копирование.
  try
    CopyFolder(Path1, Path2, Mask, Log);
  finally
    Log.SaveToFile(Path2 + 'log.ini');
    FreeAndNil(Log);
  end;
end;
0
2 / 2 / 1
Регистрация: 22.09.2012
Сообщений: 189
08.10.2012, 09:15  [ТС]
создает пустой ini файл, при чем не в той папке где нужно (полагаю в папке path2, нужно чтобы в path2\path\ примерно так...), да и вообще то мне нужно не создавать файл, а дописывать строки в конец существующего...

Добавлено через 29 минут
да, кстати, только что допер... ведь этот алгоритм копирует структуру папок и файлов, а где тогда вообще используются маски??? просто есть вероятность, что в исходной папке файлы будут лежать без папок вовсе, и тогда они должны быть разложены в соответствии с форматом, т.е. если в исходной папке 2 файла без папок 1.txt и 1.exe, то они должны быть разложены в целевой папке в папки txt и exe ... имена папок не обязательно форматы, но как то так в общем...
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
08.10.2012, 10:37
Цитата Сообщение от Илья Панов Посмотреть сообщение
создает пустой ini файл
Я там в коде сделал так, что он записывает только файлы с расширением ".TXT". Если таких файлов нет, то в INI ничего не запишется. Я сейчас тогда уберу это ограничение - чтобы все файлы записывал.
Цитата Сообщение от Илья Панов Посмотреть сообщение
создает пустой ini файл, при чем не в той папке где нужно (полагаю в папке path2, нужно чтобы в path2\path\ примерно так...), да и вообще то мне нужно не создавать файл, а дописывать строки в конец существующего...
Ну это сейчас подправим.
Цитата Сообщение от Илья Панов Посмотреть сообщение
да, кстати, только что допер... ведь этот алгоритм копирует структуру папок и файлов, а где тогда вообще используются маски??? просто есть вероятность, что в исходной папке файлы будут лежать без папок вовсе, и тогда они должны быть разложены в соответствии с форматом, т.е. если в исходной папке 2 файла без папок 1.txt и 1.exe, то они должны быть разложены в целевой папке в папки txt и exe ... имена папок не обязательно форматы, но как то так в общем...
Здесь надо дополнительную логику реализовывать... Пока подправим по предыдущим двум условиям.
---
Код с поправками:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
//Процедура копирует структуру папок из aPath1 в папку aPath2.
//И копирует файлы, соответствующие маске aMask.
//Если aMask = '', то маска принимается равной '*'.
procedure CopyFolder(const aPath1, aPath2, aMask : String; aLog : TStrings);
const
  SelfName = 'CopyFolder()';
var
  Srd, Srf : TSearchRec;
  AttrD, AttrF : Integer;
  Path1, Path2, Mask : String;
  Res : Boolean;
begin
  //Проверка путей.
  Path1 := aPath1;
  Path2 := aPath2;
  if Path1 = '' then
    raise Exception.Create(SelfName + '. Не задан путь к исходной папке.');
  if not DirectoryExists(Path1) then
    raise Exception.Create(SelfName + '. Путь к исходной папке не найден.');
  if Path2 = '' then
    raise Exception.Create(SelfName + '. Не задан путь к целевой папке.');
  //Добавление завершающего слеша в пути.
  Path1 := IncludeTrailingPathDelimiter(Path1);
  Path2 := IncludeTrailingPathDelimiter(Path2);
  //Маска имён файлов.
  Mask := aMask;
  if Mask = '' then Mask := '*';
  //Значение атрибутов, которое может соответствовать папкам.
  AttrD := faAnyFile - faVolumeID;
  //Значение атрибутов, соответствующее любым файлам, исключая тома и папки.
  AttrF := faAnyFile - faVolumeID - faDirectory;
 
  //Создаём целевую папку.
  ForceDirectories(Path2);
 
  //Перебор файлов, согласно маске.
  try
    if FindFirst(Path1 + Mask, AttrF, Srf) = 0 then
    repeat
      (*
      Res := False;
      //На случай, если не надо перезаписывать уже существующие файлы.
      if not FileExists(Path2 + Srf.Name) then begin
      *)
      //Копирование.
      Res := CopyFile(PChar(Path1 + Srf.Name), PChar(Path2 + Srf.Name), False);
      //end;
      //Сведения о скопированных файлах записываем в журнал.
      if (aLog <> nil) and Res then aLog.Add(Srf.Name);
    until FindNext(Srf) <> 0;
  finally
    FindClose(Srf);
  end;
 
  //Перебор всех папок.
  try
    if FindFirst(Path1 + '*', AttrD, Srd) = 0 then
    repeat
      //Если текущий объект является папкой и такая папка не является ссылкой
      //на саму себя '.' или на папку вышестоящего уровня '..', то выполняем
      //для неё рекурсивный вызов.
      if ( Srd.Attr and faDirectory = faDirectory )
        and (Srd.Name <> '.') and (Srd.Name <> '..')
      then
        CopyFolder(Path1 + Srd.Name, Path2 + Srd.Name, aMask, aLog);
    until FindNext(Srd) <> 0;
  finally
    FindClose(Srd);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  PathIniRel = 'ini\';
  ShFileNameIni = 'data.ini';
var
  Mask, Path1, Path2, PathIni, FileNameIni, S : String;
  Log : TStringList;
  Fs : TFileStream;
begin
  //Исходный путь.
  Path1 := Edit1.Text;
  //Целевой путь.
  Path2 := Edit2.Text;
  //Маска имён файлов.
  Mask := Edit3.Text;
 
  //Путь к целевой папке.
  Path2 := IncludeTrailingPathDelimiter(Path2);
  ForceDirectories(Path2);
  //Путь к папке, где должен быть записан ini файл.
  PathIni := IncludeTrailingPathDelimiter(Path2 + PathIniRel);
  ForceDirectories(PathIni);
  //Полный путь к INI файлу.
  FileNameIni := PathIni + ShFileNameIni;
 
  //Создаём журнал.
  Log := TStringList.Create;
  //Копирование.
  try
    CopyFolder(Path1, Path2, Mask, Log);
  finally
    //Если INI файл существует, то открываем его.
    //Иначе - создаём INI файл и открываем его.
    if FileExists(FileNameIni) then
      Fs := TFileStream.Create(FileNameIni, fmOpenWrite + fmShareDenyWrite)
    else
      Fs := TFileStream.Create(FileNameIni, fmCreate);
    //Переводим указатель в конец потока.
    Fs.Position := Fs.Size;
 
    //Если перед записью журнала надо записать заголовок в INI.
    S := FormatDateTime('dd.mm.yyyy"-"hh.mm.ss.zzz', Now) + #13#10;
    Fs.Write(S[1], Length(S) * SizeOf(Char));
 
    //Запись журнала в файловый поток.
    Log.SaveToStream(Fs);
    FreeAndNil(Fs);
    FreeAndNil(Log);
  end;
end;
1
2 / 2 / 1
Регистрация: 22.09.2012
Сообщений: 189
08.10.2012, 22:49  [ТС]
уже лучше
1. где можно вписать свой путь к ini файлу? относительно целевой папки, т.е. целевая папка\папка для ини файла\1.ini (папка с ини файлом уже существует в целевой папке)
2.
Здесь надо дополнительную логику реализовывать...
жду с нетерпением
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
08.10.2012, 23:03
Следующая версия. Теперь файлы из корневой папки исходной структуры записываются в целевую структуру в папки с теми же именами, что и расширения этих файлов.
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
implementation
 
{$R *.dfm}
 
type
  TInfo = record
    Log : TStrings; //Журнал.
    Level : Integer; //Уровень вложенности папки относительно корня в целевой структуре.
  end;
 
//Процедура копирует структуру папок из aPath1 в папку aPath2.
//И копирует файлы, соответствующие маске aMask.
//Если aMask = '', то маска принимается равной '*'.
procedure CopyFolder(const aPath1, aPath2, aMask : String; aInfo : TInfo);
const
  SelfName = 'CopyFolder()';
var
  Srd, Srf : TSearchRec;
  AttrD, AttrF : Integer;
  Path1, Path2, Path3, Mask, Ext : String;
  Res : Boolean;
  Sl : TStringList;
begin
  //Текущий уровень вложенности относительно корня в целевой структуре.
  Inc(aInfo.Level);
  //Проверка путей.
  Path1 := aPath1;
  Path2 := aPath2;
  if Path1 = '' then
    raise Exception.Create(SelfName + '. Не задан путь к исходной папке.');
  if not DirectoryExists(Path1) then
    raise Exception.Create(SelfName + '. Путь к исходной папке не найден.');
  if Path2 = '' then
    raise Exception.Create(SelfName + '. Не задан путь к целевой папке.');
  //Добавление завершающего слеша в пути.
  Path1 := IncludeTrailingPathDelimiter(Path1);
  Path2 := IncludeTrailingPathDelimiter(Path2);
  //Маска имён файлов.
  Mask := aMask;
  if Mask = '' then Mask := '*';
  //Значение атрибутов, которое может соответствовать папкам.
  AttrD := faAnyFile - faVolumeID;
  //Значение атрибутов, соответствующее любым файлам, исключая тома и папки.
  AttrF := faAnyFile - faVolumeID - faDirectory;
 
  //Создаём целевую папку.
  ForceDirectories(Path2);
  //Обнуление ссылки на список.
  Sl := nil;
  //Перебор файлов, согласно маске.
  try
    if FindFirst(Path1 + Mask, AttrF, Srf) = 0 then
    repeat
      Path3 := Path2;
      //Для верхнего уровня выполняем распределение файлов по папкам.
      if aInfo.Level = 1 then begin
        //Получаем расширение файла.
        Ext := AnsiUpperCase( ExtractFileExt(Srf.Name) );
        //Если расширение не пустое.
        if (Ext <> '') then begin
          //По расширению уточняем целевой путь.
          Path3 := Path3 + Copy(Ext, 2, Length(Ext)) + '\';
          //Если список ещё не создан, то создаём его.
          if Sl = nil then Sl := TStringList.Create;
          if Sl.IndexOf(Ext) = -1 then begin
            Sl.Add(Ext);
            ForceDirectories(Path3);
          end;
        end;
      end;
      //Копирование.
      Res := CopyFile(PChar(Path1 + Srf.Name), PChar(Path3 + Srf.Name), False);
      //Сведения о скопированных файлах записываем в журнал.
      if (aInfo.Log <> nil) and Res then aInfo.Log.Add(Srf.Name);
    until FindNext(Srf) <> 0;
  finally
    FindClose(Srf);
    FreeAndNil(Sl);
  end;
 
  //Перебор всех папок.
  try
    if FindFirst(Path1 + '*', AttrD, Srd) = 0 then
    repeat
      //Если текущий объект является папкой и такая папка не является ссылкой
      //на саму себя '.' или на папку вышестоящего уровня '..', то выполняем
      //для неё рекурсивный вызов.
      if ( Srd.Attr and faDirectory = faDirectory )
        and (Srd.Name <> '.') and (Srd.Name <> '..')
      then
        CopyFolder(Path1 + Srd.Name, Path2 + Srd.Name, aMask, aInfo);
    until FindNext(Srd) <> 0;
  finally
    FindClose(Srd);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  //Относительный путь к целевой папке в которой следует расположить INI файл.
  PathIniRel = 'ini\';
  //Короткое имя INI файла.
  ShFileNameIni = 'data.ini';
var
  Mask, Path1, Path2, PathIni, FileNameIni, S : String;
  Info : TInfo;
  Fs : TFileStream;
begin
  //Исходный путь.
  Path1 := Edit1.Text;
  //Целевой путь.
  Path2 := Edit2.Text;
  //Маска имён файлов.
  Mask := Edit3.Text;
 
  //Путь к целевой папке.
  Path2 := IncludeTrailingPathDelimiter(Path2);
  ForceDirectories(Path2);
  //Путь к папке, где должен быть записан ini файл.
  PathIni := IncludeTrailingPathDelimiter(Path2 + PathIniRel);
  ForceDirectories(PathIni);
  //Полный путь к INI файлу.
  FileNameIni := PathIni + ShFileNameIni;
 
  //Создаём журнал.
  Info.Log := TStringList.Create;
  //Счётчик уровней вложенности папок в целевой структуре.
  Info.Level := 0;
  //Копирование.
  try
    CopyFolder(Path1, Path2, Mask, Info);
  finally
    //Если INI файл существует, то открываем его.
    //Иначе - создаём INI файл и открываем его.
    if FileExists(FileNameIni) then
      Fs := TFileStream.Create(FileNameIni, fmOpenWrite + fmShareDenyWrite)
    else
      Fs := TFileStream.Create(FileNameIni, fmCreate);
    //Переводим указатель в конец потока.
    Fs.Position := Fs.Size;
 
    //Если перед записью журнала надо записать заголовок в INI.
    S := FormatDateTime('dd.mm.yyyy"-"hh.mm.ss.zzz', Now) + #13#10;
    Fs.Write(S[1], Length(S) * SizeOf(Char));
 
    //Запись журнала в файловый поток.
    Info.Log.SaveToStream(Fs);
    FreeAndNil(Fs);
    FreeAndNil(Info.Log);
  end;
end;
 
end.
Этот код можно брать и доделывать уже под более конкретные условия.
0
2 / 2 / 1
Регистрация: 22.09.2012
Сообщений: 189
09.10.2012, 00:01  [ТС]
Цитата Сообщение от Mawrat Посмотреть сообщение
Следующая версия. Теперь файлы из корневой папки исходной структуры записываются в целевую структуру в папки с теми же именами, что и расширения этих файлов.

Этот код можно брать и доделывать уже под более конкретные условия.
ох... в общем без подробностей я чувствую вы меня никогда не поймете вот держите все исходники и пояснения в архиве...
Вложения
Тип файла: rar текст.rar (3.84 Мб, 5 просмотров)
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
09.10.2012, 11:29
Ещё одна версия. Наверное, наиболее близкая к требуемым условиям.
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
implementation
 
{$R *.dfm}
 
type
  TInfo = record
    Log, Map : TStrings; //Журнал и карта соответствий директорий расширениям файлов.
    Level : Integer; //Уровень вложенности папки относительно корня в целевой структуре.
  end;
 
//Процедура копирует структуру папок из aPath1 в папку aPath2.
//И копирует файлы, соответствующие маске aMask.
//Если aMask = '', то маска принимается равной '*'.
procedure CopyFolder(const aPath1, aPath2, aMask : String; aInfo : TInfo);
const
  SelfName = 'CopyFolder()';
var
  Srd, Srf : TSearchRec;
  AttrD, AttrF : Integer;
  Path1, Path2, Path3, Ext, Mask : String;
  Res : Boolean;
begin
  //Текущий уровень вложенности относительно корня в целевой структуре.
  Inc(aInfo.Level);
  //Проверка путей.
  Path1 := aPath1;
  Path2 := aPath2;
  if Path1 = '' then
    raise Exception.Create(SelfName + '. Не задан путь к исходной папке.');
  if not DirectoryExists(Path1) then
    raise Exception.Create(SelfName + '. Путь к исходной папке не найден.');
  if Path2 = '' then
    raise Exception.Create(SelfName + '. Не задан путь к целевой папке.');
  //Добавление завершающего слеша в пути.
  Path1 := IncludeTrailingPathDelimiter(Path1);
  Path2 := IncludeTrailingPathDelimiter(Path2);
  //Маска имён файлов.
  Mask := aMask;
  if Mask = '' then Mask := '*';
  //Значение атрибутов, которое может соответствовать папкам.
  AttrD := faAnyFile - faVolumeID;
  //Значение атрибутов, соответствующее любым файлам, исключая тома и папки.
  AttrF := faAnyFile - faVolumeID - faDirectory;
 
  //Создаём целевую папку.
  ForceDirectories(Path2);
  //Перебор файлов, согласно маске.
  try
    if FindFirst(Path1 + Mask, AttrF, Srf) = 0 then
    repeat
      Path3 := Path2; //Уточнённый целевой путь. - В зависимости от расширения файла.
      //Получаем расширение файла.
      Ext := AnsiUpperCase( ExtractFileExt(Srf.Name) );
      //Для верхнего уровня на основе расширений выполняем распределение файлов по папкам.
      if aInfo.Level = 1 then begin
        //По расширению уточняем целевой путь.
        Path3 := Path3 + aInfo.Map.Values[Ext];
        //Создаём целевую папку, если она ещё не создана.
        ForceDirectories(Path3);
      end;
      //Копирование.
      Res := CopyFile(PChar(Path1 + Srf.Name), PChar(Path3 + Srf.Name), False);
      //Сведения о скопированных ".AMXX" файлах записываем в журнал.
      if (aInfo.Log <> nil) and Res and (Ext = '.AMXX') then aInfo.Log.Add(Srf.Name);
    until FindNext(Srf) <> 0;
  finally
    FindClose(Srf);
  end;
 
  //Перебор всех папок.
  try
    if FindFirst(Path1 + '*', AttrD, Srd) = 0 then
    repeat
      //Если текущий объект является папкой и такая папка не является ссылкой
      //на саму себя '.' или на папку вышестоящего уровня '..', то выполняем
      //для неё рекурсивный вызов.
      if ( Srd.Attr and faDirectory = faDirectory )
        and (Srd.Name <> '.') and (Srd.Name <> '..')
      then
        CopyFolder(Path1 + Srd.Name, Path2 + Srd.Name, aMask, aInfo);
    until FindNext(Srd) <> 0;
  finally
    FindClose(Srd);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  //Относительный путь к целевой папке в которой следует расположить INI файл.
  PathIniRel = 'configs\';
  //Короткое имя INI файла.
  ShFileNameIni = 'plugins.ini';
var
  Mask, Path1, Path2, PathIni, FileNameIni, S : String;
  Info : TInfo;
  Fs : TFileStream;
begin
  //Исходный путь.
  Path1 := Edit1.Text;
  //Целевой путь.
  Path2 := Edit2.Text;
  //Маска имён файлов.
  Mask := Edit3.Text;
 
  //Путь к целевой папке.
  Path2 := IncludeTrailingPathDelimiter(Path2);
  ForceDirectories(Path2);
  //Путь к папке, где должен быть записан ini файл.
  PathIni := IncludeTrailingPathDelimiter(Path2 + PathIniRel);
  ForceDirectories(PathIni);
  //Полный путь к INI файлу.
  FileNameIni := PathIni + ShFileNameIni;
 
  //Создаём журнал.
  Info.Log := TStringList.Create;
  //Создаём карту соответствий.
  Info.Map := TStringList.Create;
  //Заполняем карту соответствий.
  //Содержимое можно загрузить из файла через: Info.Map.LoadFromFile().
  Info.Map.Add('.AMXX=plugins\');
  Info.Map.Add('.SMA=scripting\');
  Info.Map.Add('.CFG=configs\');
  Info.Map.Add('.INI=configs\');
  Info.Map.Add('.TXT=amxmodx\data\lang\');
  //Счётчик уровней вложенности папок в целевой структуре.
  Info.Level := 0;
  //Копирование.
  try
    CopyFolder(Path1, Path2, Mask, Info);
  finally
    //Если INI файл существует, то открываем его.
    //Иначе - создаём INI файл и открываем его.
    if FileExists(FileNameIni) then
      Fs := TFileStream.Create(FileNameIni, fmOpenWrite + fmShareDenyWrite)
    else
      Fs := TFileStream.Create(FileNameIni, fmCreate);
    //Переводим указатель в конец потока.
    Fs.Position := Fs.Size;
 
    //Если перед записью журнала надо записать заголовок в INI.
    //S := FormatDateTime('dd.mm.yyyy"-"hh.mm.ss.zzz', Now) + #13#10;
    Fs.Write(S[1], Length(S) * SizeOf(Char));
 
    //Запись журнала в файловый поток.
    Info.Log.SaveToStream(Fs);
    FreeAndNil(Fs);
    FreeAndNil(Info.Log);
    FreeAndNil(Info.Map);
  end;
end;
 
end.
1
2 / 2 / 1
Регистрация: 22.09.2012
Сообщений: 189
09.10.2012, 12:39  [ТС]
TInfo = record;

Expected ':' but '=' found.
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
09.10.2012, 13:20
Я этот код прямо в проект добавил.
И в проекте надо предусмотреть случай, когда в реестре нет сведений о целевом пути: if Dir1 = '' then ...
Вложения
Тип файла: rar project-02.rar (184.7 Кб, 5 просмотров)
1
2 / 2 / 1
Регистрация: 22.09.2012
Сообщений: 189
09.10.2012, 14:12  [ТС]
Цитата Сообщение от Mawrat Посмотреть сообщение
Я этот код прямо в проект добавил.
И в проекте надо предусмотреть случай, когда в реестре нет сведений о целевом пути: if Dir1 = '' then ...
все бы хорошо, и затестил даже без папок в исходной папке, все ок копирует спс, но упорно отказывается дописывать строчку *.amxx в plugins.ini говорит (при нажатие на установить) что: Процесс не может получить доступ к файлу(plugins.ini), т.к. этот файл занят другим процессом. Посмотрел Unlocker-ом блокирует файл как раз сам project1.exe о_О
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
09.10.2012, 14:26
Там в проекте прежняя переменная для обработки INI файла осталась. Сейчас подправил. Проверяй.
Вложения
Тип файла: rar project-03.rar (184.8 Кб, 5 просмотров)
1
2 / 2 / 1
Регистрация: 22.09.2012
Сообщений: 189
09.10.2012, 14:48  [ТС]
Цитата Сообщение от Mawrat Посмотреть сообщение
Там в проекте прежняя переменная для обработки INI файла осталась. Сейчас подправил. Проверяй.
алилуя добавляет спс
почти идеально, только еще чтобы на следующую строку добавляло как сделать? ну глянь просто в сам этот файл (plugins.ini) он добавляет в самый конец безо всяких пробелов и переносов
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
09.10.2012, 15:12
Цитата Сообщение от Илья Панов Посмотреть сообщение
почти идеально, только еще чтобы на следующую строку добавляло как сделать? ну глянь просто в сам этот файл (plugins.ini) он добавляет в самый конец безо всяких пробелов и переносов
Там добавление происходит в конец файла, но каждая запись там на отдельной строке записывается. Вот таким образом:
Code
1
2
3
autobinds-01.amxx
autobinds-02.amxx
autobinds-03.amxx
А нужно как-то по-другому? Пустые строки надо добавлять? Или ещё как-то?
0
2 / 2 / 1
Регистрация: 22.09.2012
Сообщений: 189
09.10.2012, 15:21  [ТС]
Цитата Сообщение от Mawrat Посмотреть сообщение
Там добавление происходит в конец файла, но каждая запись там на отдельной строке записывается. Вот таким образом:
Code
1
2
3
autobinds-01.amxx
autobinds-02.amxx
autobinds-03.amxx
А нужно как-то по-другому? Пустые строки надо добавлять? Или ещё как-то?
если бы... afkbombtransfer.amxxautobinds.amxx вот так он сейчас добавляет (юзаю последнюю скинутую тобой версию)
п.с. при этом действительно появляется еще в конце пустая строка, но autobinds.amxx на нее не переносится

а вот сейчас еще раз попробовал (несколько раз установил) дописываются на новую строку autobinds.amxx все правильно, но когда 1 раз устанавливаю, на новую строку не переносится
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
09.10.2012, 15:25
Исправленная версия. Теперь, если в INI файле в конце нет переноса строки, то такой перенос добавляется.
Вложения
Тип файла: rar project-04.rar (184.9 Кб, 8 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.10.2012, 15:25

Поиск и копирование файлов
Доброго Времени суток. Народ может вопрос мой будет звучит и глупо но нужна помощ вот в чем, нужно сделать так в делфи7 что бы при нажатии...

Поиск файлов и копирование
Здравствуйте, подскажите пожалуайста, как сделать поиск с копированием файлов по расширению на диске &quot;C:&quot;, чтобы поиск не...

Поиск и копирование файлов
Уважаемые знатоки! Прошу вашей помощи.На просторах интернета нашёл батник,который ищет на всех дисках и копирует найденные GIF файлы в...

Поиск и копирование файлов
Пересмотрел все что смог понять, но так ничего толком и не нашел. Нужно искать на диске С: например файлы ТХТ и копировать их в...

Авто поиск и копирование файлов
rem если вам надо копировать другие файлы замените значение переменной nam rem по умолчанию поиск и копирование файлов с диска C:\ и всех...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru