И так у меня есть такой поиск, ищет по частям с начало папки а потом уже нужный файл. Так же тут определяется разрядность компьютера, так как на разных разрядностях по разному подписаны папки. Вопрос такой, что я не пойму где допустил скажем так ошибку. там есть поиск папки v140 или же v145, и по ним дальше работать, но если в друг найдет папку v150 или какую нибудь v5678, то ясное дальше поиск нужного exe не найдет. Подскажите где нужно написать условия ограничения или что-то подобное чтобы не находило не нужные папки, а скажем только v140 и v145.
Код:
procedure TForm1.ScanDir(Dir: string);
var
hFind: THandle;
FD: TWIN32FindData;
begin
hFind:= FindFirstFile(PChar(Dir + '\*.*'), FD);
if (hFind <> INVALID_HANDLE_VALUE) then try
repeat
if (FD.cFileName<>String('.')) and (FD.cFileName <> '..') then begin
if (FD.dwFileAttributes and faDirectory) <> 0 then
Form1.Memo2.Lines.Add(Dir + FD.cFileName);
end;
until not FindNextFile(hFind,FD);
finally
Windows.FindClose(hFind);
end;
end;
procedure TForm1.FindFiles(StartFolder, Mask: string; List: TStrings; ScanSubFolders: Boolean = True);
var
SearchRec: TSearchRec;
FindResult: Integer;
begin
List.BeginUpdate;
try
StartFolder := IncludeTrailingPathDelimiter(StartFolder);
FindResult := FindFirst(StartFolder + '*.*', faAnyFile, SearchRec);
try
while FindResult = 0 do
with SearchRec do
begin
if (Attr and faDirectory) <> 0 then
begin
if ScanSubFolders and (Name <> '.') and (Name <> '..') then
FindFiles(StartFolder + Name, Mask, List, ScanSubFolders);
end
else
begin
if MatchesMask(Name, Mask) then
List.Add(StartFolder + Name);
end;
FindResult := FindNext(SearchRec);
end;
finally
FindClose(SearchRec);
end;
finally
List.EndUpdate;
end;
end;
function IsWin64: Boolean;
type
TIsWow64Process = function(Handle: THandle; var Res: BOOL): BOOL; stdcall;
var
IsWow64Result: BOOL; // Result from IsWow64Process
IsWow64Process: TIsWow64Process; // IsWow64Process fn reference
begin
Result := False;
IsWow64Process := GetProcAddress(GetModuleHandle(Kernel32), 'IsWow64Process'); // Do Not Localize
if (Assigned(IsWow64Process) and IsWow64Process(GetCurrentProcess, IsWow64Result)) then
Result := IsWow64Result;
end;
procedure TForm1.v140T(Sender: TObject);
begin
poisk := Memo2.lines[col-1] +'\ANSYS\bin\winx64\';
FindFiles(poisk, 'ansys140.exe', memo2.Lines, true);
end;
procedure TForm1.v140F(Sender: TObject);
begin
poisk := Memo2.lines[col-1] +'\ANSYS\bin\Intel\';
FindFiles(poisk, 'ansys140.exe', memo2.Lines, true);
end;
procedure TForm1.v145T(Sender: TObject);
begin
poisk := Memo2.lines[col-1] +'\ANSYS\bin\winx64\';
FindFiles(poisk, 'ansys145.exe', memo2.Lines, true);
end;
procedure TForm1.v145F(Sender: TObject);
begin
poisk := Memo2.lines[col-1] +'\ANSYS\bin\Intel\';
FindFiles(poisk, 'ansys145.exe', memo2.Lines, true);
end;
procedure TForm1.PoiskA(Sender: TObject);
var
Find:string;
inst:integer;
Find2:string;
finis:string;
ilis:integer;
begin
Memo2.Clear;
Memo3.Lines.Add('...Поиск ANSYS'+' ['+DateToStr( Date ) + ' ' + TimeToStr( Time )+']');
ScanDir('C:\Program Files\ANSYS Inc\');
ScanDir('D:\Program Files\ANSYS Inc\');
ScanDir('E:\Program Files\ANSYS Inc\');
ScanDir('C:\Program Files(x86)\ANSYS Inc\');
ScanDir('D:\Program Files(x86)\ANSYS Inc\');
ScanDir('E:\Program Files(x86)\ANSYS Inc\');
if memo2.Lines.Count = 0 then
begin
ShowMessage('Скачайте и установите программу ANSYS');
end;
find:='v140';
find2:='v145';
For inst:=0 to Memo2.Lines.Count-1 do
If Pos(find2, Memo2.Lines.Text)=0
Then
Begin
If Pos(find, Memo2.Lines.Text)<>0
Then
Begin
col := Memo2.Lines.Count;
Case IsWin64 of
True: v140T(Sender);
False: v140F(Sender);
end;
End;
End
else
Begin
col := Memo2.Lines.Count;
Case IsWin64 of
True: v145T(Sender);
False: v145F(Sender);
end;
End;
begin
for ilis :=0 to Memo2.Lines.Count-1 do
if Pos('exe', Memo2.Lines.Strings[col-1])<>0 then
begin
finis := Memo2.lines[col-1];
end
else
begin
ShowMessage('Проверьте целостность файлов программы ANSYS');
end;
end;
End;