Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


Сообщения: 1133
Благодарности: 581

Профиль | Отправить PM | Цитировать


Цитата El Sanchez:
перевод размера файла в удобочитаемую форму можно возложить на винду, например: »
Спасибо, честно говоря не знал про эту функцию, хотел уже добавить в скрипт, но на юникоде размер больших архивов не правильно показывает, правда сильно не ковырял...
Цитата FX-DENIS:
дописал »
Вы пишите 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:
Как и сказано в справке, не работает. »
Попробовал в стандартной, работает

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:03, 20-03-2012 | #1210