Inno Setup FileExists не может найти существующий файл
В моем сценарии я проверяю, существует ли каталог и два файла в этом каталоге. В то время как первая возвращает правильное значение, вторая проверка - нет. Я несколько раз проверял, что эти файлы существуют в указанном каталоге, но Inno Setup всегда будет сообщать мне, что они не существуют. Это происходит на виртуальном сервере Windows и не может быть воспроизведено на моей локальной машине. Там всегда возвращается правильное значение.
UpdatePath := ExpandConstant('{app}');
if DirExists(UpdatePath) then begin
ExePath := UpdatePath+'\Application.exe';
ConfigFilePath := UpdatePath+'\Application.exe.config';
if FileExists(ExePath) and FileExists(ConfigFilePath) then begin //this one returns incorrect values
//Do Stuff
end else begin
MsgBox(FmtMessage(CustomMessage('DirPageFileNotFound'), [ExePath, ConfigFilePath]),mbInformation,MB_OK);
Result := False;
end;
end else begin
MsgBox(FmtMessage(CustomMessage('DirPageDirectoryNotFound'), [UpdatePath]),mbInformation,MB_OK);
Result := False;
end;
Как вы можете видеть, я проверяю исполняемый файл, который также может быть выполнен при двойном щелчке. Он есть, но Inno Setup всегда скажет мне, что его там нет. Виртуальная среда мешает с этим? Что здесь происходит?
1 ответ
Чтобы устранить проблему, попробуйте добавить следующий код. Затем проверьте файл журнала установщика и вывод dir
команда:
#ifdef UNICODE
#define AW "W"
#else
#define AW "A"
#endif
function GetFileAttributes(lpFileName: string): DWORD;
external 'GetFileAttributes{#AW}@kernel32.dll stdcall';
function GetLastError() : LongInt;
external 'GetLastError@kernel32.dll stdcall';
const
INVALID_FILE_ATTRIBUTES = $FFFFFFFF;
procedure ...;
var
UpdatePath: string;
ExePath: string;
FindRec: TFindRec;
Attrs: DWORD;
LastError: LongInt;
ResultCode: Integer;
begin
Log('InitializeWizard');
UpdatePath := ExpandConstant('{app}');
ExePath := UpdatePath+'\Application.exe';
if FileExists(ExePath) then
begin
Log(ExePath + ' exists');
end
else
begin
LastError := GetLastError;
Log(ExePath + ' does not exist - ' +
Format('System Error. Code: %d. %s', [LastError, SysErrorMessage(LastError)]));
end;
if not FindFirst(UpdatePath + '\*', FindRec) then
begin
LastError := GetLastError;
Log(UpdatePath + ' not found - ' +
Format('System Error. Code: %d. %s', [LastError, SysErrorMessage(LastError)]));
end
else
begin
repeat
Log('Found file: ' + FindRec.Name + ' in ' + UpdatePath);
until not FindNext(FindRec);
end;
Attrs := GetFileAttributes(ExePath);
if Attrs <> INVALID_FILE_ATTRIBUTES then
begin
Log(ExePath + ' attributes = ' + IntToStr(Attrs));
end
else
begin
LastError := GetLastError;
Log(Format('Cannot get attributes of ' + ExePath + ': System Error. Code: %d. %s', [
LastError, SysErrorMessage(LastError)]));
end;
Exec(ExpandConstant('{cmd}'), '/k dir "' + UpdatePath + '"', '', SW_SHOW,
ewWaitUntilTerminated, ResultCode);
end;
FileExists
внутренне использует FindFirst
/ FindNext
а также GetFileAttributes
, Так что это выяснить, что вызывает проблему.
Я предпочитаю предположить, что целевой компьютер является 64-битным, и по какой-то причине происходит перенаправление файловой системы.
Попробуйте использовать EnableFsRedirection
отключить перенаправление перед звонком FileExists
:
EnableFsRedirection(False);