Цитата El Sanchez:
перевод размера файла в удобочитаемую форму можно возложить на винду, например: »
|
Спасибо, честно говоря не знал про эту функцию, хотел уже добавить в скрипт, но на юникоде размер больших архивов не правильно показывает, правда сильно не ковырял...
Вы пишите MsgBox(BytesToReadable(GetFileSize('
Test Drive Unlimited 2\bigfile_RU_1.big'), 1), mbInformation, MB_OK);
где тут полный путь до файла? при такой раскладке он должен лежать в одном каталоге с инсталлятором.
В любом случае извиняюсь за свою не внимательность, нашёл ошибку в формуле, исправил и добавил доп. проверку:
Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
Compression=lzma2/ultra64
InternalCompressLevel=ultra64
SolidCompression=yes
[Languages]
Name: ru; MessagesFile: compiler:Languages\Russian.isl
[CustomMessages]
ru.Bt=Бт
ru.Kb=Кб
ru.Mb=Мб
ru.Gb=Гб
ru.Tb=Тб
ru.Pb=Пб
ru.Eb=Эб
[Files]
Source: compiler:Examples\*; DestDir: {app}; AfterInstall: Progress; Flags: ignoreversion createallsubdirs recursesubdirs sortfilesbyextension sortfilesbyname
[Code]
var
ProgressLabel, SizeLabel: TLabel;
function BytesToReadable(const Bytes: Extended; Signs: Integer): string;
{ Перевод числа в значение Бт/Кб/Мб/Гб/Тб/Пб/Эб (Signs - количество знаков после запятой)}
var
ABytes: Extended;
n: Integer;
begin
Result := '';
if Int(Bytes) > 0 then
try
n := 0;
ABytes := Bytes;
while Int(ABytes) >= 1024 do
begin
ABytes := ABytes/1024;
n := n + 1;
end;
case n of
0: Result := Format('%d ' + ExpandConstant('{cm:Bt}'), [Round(ABytes)]); // Байт
1: Result := Format('%.' + IntToStr(Signs) + 'n ' + ExpandConstant('{cm:Kb}'), [ABytes]); // Килобайт
2: Result := Format('%.' + IntToStr(Signs) + 'n ' + ExpandConstant('{cm:Mb}'), [ABytes]); // Мегабайт
3: Result := Format('%.' + IntToStr(Signs) + 'n ' + ExpandConstant('{cm:Gb}'), [ABytes]); // Гигабайт
4: Result := Format('%.' + IntToStr(Signs) + 'n ' + ExpandConstant('{cm:Tb}'), [ABytes]); // Терабайт
// больше Терабайта конечно не пригодится, покрайней мере в ближайшее время, но всё же...
5: Result := Format('%.' + IntToStr(Signs) + 'n ' + ExpandConstant('{cm:Pb}'), [ABytes]); // Петабайт
6: Result := Format('%.' + IntToStr(Signs) + 'n ' + ExpandConstant('{cm:Eb}'), [ABytes]); // Эксабайт
end;
finally
if (Result <> '') and (Pos(',', Result) > 0) then
StringChange(Result, ',', '.');
end;
end;
function Size64(Hi, Lo: Integer): Extended;
begin
Result := Lo;
if Lo < 0 then
Result := Result + $7FFFFFFF + $7FFFFFFF + 2;
for Hi := Hi - 1 downto 0 do
Result := Result + $7FFFFFFF + $7FFFFFFF + 2;
end;
function GetFileSize(const FileName: string): Extended;
var
FindRec: TFindRec;
begin
Result := 0;
if FindFirst(FileName, FindRec) then
try
if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
Result := Size64(FindRec.SizeHigh, FindRec.SizeLow);
finally
FindClose(FindRec);
end;
end;
procedure Progress();
begin
with WizardForm.ProgressGauge do
// ProgressLabel.Caption := IntToStr((Position-Min)/((Max - Min)/100)) + '%'; // часто видел, но никогда не вникал в эту формулу...
ProgressLabel.Caption := IntToStr((Position*100)/Max) + '%'; // правильное отображение процентов
SizeLabel.Caption := BytesToReadable(GetFileSize(ExpandConstant(CurrentFileName)), 1);
end;
procedure InitializeWizard();
begin
ProgressLabel := TLabel.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressLabel.Top := Top + Height + ScaleY(8);
ProgressLabel.Left := Left + Width/2 - ScaleX(8);
ProgressLabel.AutoSize := True;
ProgressLabel.Parent := WizardForm.InstallingPage;
end;
SizeLabel := TLabel.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
SizeLabel.Top := Top + Height + ScaleY(8);
SizeLabel.Left := Left;
SizeLabel.AutoSize := True;
SizeLabel.Parent := WizardForm.InstallingPage;
end;
end;
Цитата R.i.m.s.k.y.:
или почему бы не воспользоваться стандартной FileSize »
|
Есть ограничение, укажет размер файла не более 2ГБ
Цитата boss911:
Так что по-прежнему продолжаю не знать. »
|
Привет Серёга
Лександер, верно говорит. Да в справке написано, что уже не поддерживает, но пока ещё работает...
Цитата boss911:
Как и сказано в справке, не работает. »
|
Попробовал в стандартной, работает