Вопрос Удаление файлов по маске

Awalder

Новичок
Доброго дня!
Подскажите, возможно ли перед установкой мода на игру - очистить папку от ненужных файлов, используя функцию
DeleteFile(ExpandConstant('{userdocs}\My Games\Age of Empires III\Savegame\sp_Amsterdam_homecity.xml'));
, при этом сохраняя оригинальные файлы, список оригинальных файлов известен. Как бы по маске, или как правильнее выразиться))

Например - удалить все файлы из папки My Games\Age of Empires III\Savegame\groupings\ *** \\кроме файла Stringtable.xml
 
Последнее редактирование:

sergey3695

Ветеран
Модератор
Awalder, примерно так
Код:
procedure Delete;
var
  str,str2: string;
  FSR: TFindRec;
  FindResult: Boolean;
begin
  FindResult:= FindFirst(ExpandConstant('{userdocs}\My Games\Age of Empires III\Savegame\groupings\*.*'), FSR);
while FindResult do begin
  str:= FSR.Name;
  str2:= 'Stringtable.xml';
  SetLength(str, Length(str2));
if CompareText(str,str2)<>0 then
  DeleteFile(ExpandConstant('{userdocs}\My Games\Age of Empires III\Savegame\groupings\'+ str));
  FindResult:= FindNext(FSR);
end;
  FindClose(FSR);
end;
 

Awalder

Новичок
Awalder, примерно так

[/code]
Спасибо за ответ!
Что означают строки в "шапке"? :
var
str,str2: string;
допустим у меня 3 или несколько файлов в папке, которые надо не удалять. , соответственно у меня появятся str,str2, str3,str4, .....,? или как должно выглядеть?
Где можно более подробную инфу почитать об этом? С уважением
 

sergey3695

Ветеран
Модератор
Awalder, да не...TStringList есть для таких целей. надо было сразу с ним написать (
Код:
procedure Delete;
var
  str: string;
  str2 : TStringList;
  FSR: TFindRec;
  FindResult: Boolean;
  i: integer;
  Del: boolean;
begin
  str2 := TStringList.Create;
  str2.Add('первый файл не надо');
  str2.Add('второй');
  str2.Add('третий');
//
  FindResult:= FindFirst(ExpandConstant('{userdocs}\My Games\Age of Empires III\Savegame\groupings\*.*'), FSR);
while FindResult do begin
  str:= FSR.Name;
  Del:= True;
for i := 0 to str2.Count-1 do
begin
if CompareText(str,str2[i])=0 then
  Del:= False;
end;
if Del then
  DeleteFile(ExpandConstant('{userdocs}\My Games\Age of Empires III\Savegame\groupings\'+ str));
  FindResult:= FindNext(FSR);
end;
  FindClose(FSR);
end;
 
Последнее редактирование:

Awalder

Новичок
Awalder, да не...TStringList есть для таких целей. надо было сразу с ним написать (
Код:
procedure Delete;
var
  str: string;
  str2 : TStringList;
  FSR: TFindRec;
  FindResult: Boolean;
  i: integer;
  Del: boolean;
begin
  str2 := TStringList.Create;
  str2.Add('первый файл не надо');
  str2.Add('второй');
  str2.Add('третий');
//
  FindResult:= FindFirst(ExpandConstant('{userdocs}\My Games\Age of Empires III\Savegame\groupings\*.*'), FSR);
while FindResult do begin
  str:= FSR.Name;
  Del:= True;
for i := 0 to str2.Count-1 do
begin
if CompareText(str,str2[i])=0 then
  Del:= False;
end;
if Del then
  DeleteFile(ExpandConstant('{userdocs}\My Games\Age of Empires III\Savegame\groupings\'+ str));
  FindResult:= FindNext(FSR);
end;
  FindClose(FSR);
end;
Отлично! с одной папкой допустим, разобрались) Если таких папок две-три, и в каждой надо оставить оригиналы, а "мусор отсеять" - то это возможно?
 

sergey3695

Ветеран
Модератор
Awalder, ну можно написать процедурку, которая тащит данные скажем с .ini - что сканировать (чистить) и не удалять. Но суть то таже. Работа с ини файлами в справке.
 

Le9ent

Новичок
На основе вашего примера добавил процедуру вида:
Код:
procedure DeleteFileMask(Path, Params: String);
var
  Str: String;
  FSR: TFindRec;
  FindResult: Boolean;
begin
  FindResult:= FindFirst(Path + Params, FSR);
  while FindResult do begin
    Str:= FSR.Name;
    DeleteFile(Path + Str);
    FindResult:= FindNext(FSR);
  end;
  FindClose(FSR);
end;
Код:
DeleteFileMask(ExpandConstant('{app}\'), '*.log');
DeleteFileMask(ExpandConstant('{app}\'), '*.cache');
Может быть кому то понадобится.
Как альтернатива стандартой DeleteFile()
 
Последнее редактирование:

Andreo Fadio

Старожил
Подскажите, возможно ли перед установкой мода на игру - очистить папку от ненужных файлов, используя функцию
DeleteFile
Можно например использовать стандартную секцию Inno перед установкой:
Код:
[InstallDelete]
Type: files; Name: {app}\*.log
Type: files; Name: {app}\пример папки 1\*.*log
Type: files; Name: {userdocs}\папка сохранений\*.*log*
 

Suomy

Новичок
Ребят, если тема еще живая, может кто то подсказать, какой код написать и куда вставить, чтобы при деинсталляции игры, появлялся запрос на удаления сохранений игры, как например у деинсталлятора GoG.
P/S: сохранения лежат в appdata\roaming
 

YURSHAT

Тех. админ
Администратор
Ребят, если тема еще живая, может кто то подсказать, какой код написать и куда вставить, чтобы при деинсталляции игры, появлялся запрос на удаления сохранений игры, как например у деинсталлятора GoG.
P/S: сохранения лежат в appdata\roaming
Как-то так:
Форматирование (BB-код):
#define SaveDir "MySavedGames"

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[CustomMessages]
DeleteSave=Удалить сохраненные игры и профили?

[_Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
  begin
    if DirExists(ExpandConstant('{userappdata}') + '\{#SaveDir}') then
      if MsgBox(CustomMessage('DeleteSave'), mbInformation, MB_YESNO) = idYes then
        DelTree(ExpandConstant('{userappdata}') + '\{#SaveDir}', True, True, True);
  end;
end;
 
Последнее редактирование:

Suomy

Новичок
Как-то так:
Форматирование (BB-код):
#define SaveDir "MySavedGames"

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[CustomMessages]
DeleteSave=Удалить сохраненные игры и профили?

[_Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
  begin
    if DirExists(ExpandConstant('{userappdata}') + '\{#SaveDir}') then
      if MsgBox(ExpandConstant('{cm:DeleteSave}'), mbInformation, MB_YESNO) = idYes then
        DelTree(ExpandConstant('{userappdata}') + '\{#SaveDir}', True, True, True);
  end;
end;
спасибо, буду пробовать.
 

Suomy

Новичок
Как-то так:
Форматирование (BB-код):
#define SaveDir "MySavedGames"

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[CustomMessages]
DeleteSave=Удалить сохраненные игры и профили?

[_Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
  begin
    if DirExists(ExpandConstant('{userappdata}') + '\{#SaveDir}') then
      if MsgBox(ExpandConstant('{cm:DeleteSave}'), mbInformation, MB_YESNO) = idYes then
        DelTree(ExpandConstant('{userappdata}') + '\{#SaveDir}', True, True, True);
  end;
end;
а не подскажешь как быть, код рабочий, вопрос такой, в названии папки с сохранеиями игры, создается автоматически, присутствует апостроф ('), и при компиляции inno ругается на него, как обойти эту проблему, и возможно ли?
 

Suomy

Новичок
Дописать еще один, либо использовать chr(39), либо #39
про дописать я сам уже догадался, вернее справку почитал, но после добавления второго апострофа, то есть, 'мама''папа', сохранка удаляется, но. по завершении удаления, появляется окно, что не удалось удалить часть файлов, удалите руками, либо использовать chr(39), либо #39, это я не знаю как использовать, куда прописать, я еще не настолько хорошо владею прописыванием кодов.

p/S: а нет, двойной апостроф нормально сработал, просто допустил другую ошибку в коде, поэтому выбивало такую, что не вс файлы удалены.
 
Последнее редактирование:
Сверху