При разработке приложения, у которого есть несколько гигабайт данных изображений, хранящихся в директории {app}, может возникнуть необходимость перенести эти данные в директорию {commonappdata} в ходе установки с помощью Inno Setup. Однако, при попытке перенести директорию с изображениями с помощью RenameFile или FileCopy могут возникнуть неожиданные ошибки.
В этой статье мы рассмотрим, почему RenameFile и FileCopy могут не работать на некоторых компьютерах, хотя все sembra правильно, и предложим решение для устранения этих проблем.
Описание проблемы
Приложение имеет несколько гигабайт данных изображений, которые хранятся в директории {app}. При следующем обновлении необходимо перенести эти данные в директорию {commonappdata} в ходе установки с помощью Inno Setup, чтобы приложение вело себя как хорошая программа. Для этого была создана процедура, которая пытается переместить директорию с изображениями (определенную параметром InName) путем переименования (для ускорения). Если переименование не удается (например, если директории находятся на разных дисках), процедура копирует файл и затем удаляет исходный файл.
Эта процедура работает правильно на компьютере разработчика и на всех доступных компьютерах, но на большинстве других компьютеров она не может переименовать директорию и затем не может скопировать ее. Процедура ведет журнал всех действий, поэтому известно, что имена исходного и целевого файлов правильные, но RenameFile и FileCopy просто терпят неудачу без объяснений.
Пример кода
Вот пример кода процедуры MoveIt, которая пытается переместить директорию с изображениями:
procedure MoveIt(InName: string);
var
Sstr, Dstr: string;
begin
Sstr := ExpandConstant('{app}') + '\images\' + InName;
Dstr := ExpandConstant('{commonappdata}') + '\MyApp\images\' + InName;
Log('Source: ' + Sstr);
Log('Destination: ' + Dstr);
if DirExists(Sstr) then
begin
OutputMsgMemoWizardPage.RichEditViewer.Lines.Add(InName + '...');
if RenameFile(ExpandConstant('{app}') + '\images\' + InName, ExpandConstant('{commonappdata}') + '\MyApp\images\' + InName) then
begin
Log('Rename result=success');
OutputMsgMemoWizardPage.RichEditViewer.Lines[OutputMsgMemoWizardPage.RichEditViewer.Lines.Count - 1] := InName + ': success';
end
else
begin
Log('Rename result=Failed');
if FileCopy(ExpandConstant('{app}') + '\images\' + InName, ExpandConstant('{commonappdata}') + '\MyApp\Folder images\' + InName, true) then
begin
Log('Copy result=success');
OutputMsgMemoWizardPage.RichEditViewer.Lines[OutputMsgMemoWizardPage.RichEditViewer.Lines.Count - 1] := InName + ': success';
if DeleteFile(ExpandConstant('{app}') + '\images\' + InName) then
Log('Delete result=success')
else
begin
Log('Delete result=Failed');
OutputMsgMemoWizardPage.RichEditViewer.Lines.Add(InName + '(Could not delete source directory)');
end;
end
else
begin
Log('Copy result=Failed');
OutputMsgMemoWizardPage.RichEditViewer.Lines[OutputMsgMemoWizardPage.RichEditViewer.Lines.Count - 1] := InName + ': Failed';
end;
end;
end
else
Log('Source file not found');
end;
Причины проблем
Причинами неудач RenameFile и FileCopy могут быть несколько факторов:
Отсутствие целевой директории: RenameFile и FileCopy не создают целевые директории автоматически. Если целевая директория не существует, эти функции не смогут переименовать или скопировать файл.
Отсутствие прав доступа: Если пользователь, под cuim
Диагностика проблем при переносе данных изображений из директории {app} в {commonappdata} в Inno Setup: РenameFile и FileCopy
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.