помню спрашивал как быстро определить размер папки (те для меня пример ...\Inno Setup 5\Scripts\Dobrov\DirSizeCal.iss работает слишком медленно)
нашёл пример использующий объект FileSystemObject
на форуме
результат - функция (здесь вывод в мегабайтах под мои нужды) :

Код:
Код: Выделить всё
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[ code]
function GetFolserSize(path:string):Integer;
var
oFS: Variant;
begin
oFS := CreateOleObject('Scripting.FileSystemObject');
Result := oFS.GetFolder(path).Size div (1024*1024);
end;
procedure InitializeWizard();
begin
MsgBox(IntToStr(GetFolserSize('C:\Program Files (x86)')), mbInformation, MB_OK);
end;в данном случае папку Program Files (x86) у меня (пока что размером почти 2 гига после переустановки винды) посчитала за секунду
более наглядный пример:
Код:
Код: Выделить всё
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[ code]
function GetFolserSize(path:string):Extended;
var
oFS: Variant;
begin
oFS := CreateOleObject('Scripting.FileSystemObject');
Result := oFS.GetFolder(path).Size;
end;
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function BytesToSize(Bytes: Extended): String;
var
pszBuf: array [0..15] of Char;
begin
try
Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], sizeof(pszBuf));
except end;
end;
procedure InitializeWizard();
begin
MsgBox(BytesToSize(GetFolserSize('C:\Program Files (x86)')), mbInformation, MB_OK);
end;но вот при попытке посчитать C:\Windows вылетает с ошибкой на Result := oFS.GetFolder(path).Size div (1024*1024);
---------------------------
Runtime Error
---------------------------
Line 14:
Exception: : .
---------------------------
ОК
---------------------------
может папка слишком большого размера и он не может посчитать или я функцию криво записал
с другой стороны папку с видео размером больше 250 гигов посчитала корректно и тоже быстро
в общем хотелось бы узнать в чём причина ошибки ну и как следствие - улучшение/исправление
в качестве производных:
размер файла:
Код:
Код: Выделить всё
function GetFileSize(FilePath:string):Extended;
var
oFS: Variant;
begin
oFS := CreateOleObject('Scripting.FileSystemObject');
Result := oFS.GetFile(FilePath).Size;
end;
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function BytesToSize(Bytes: Extended): String;
var
pszBuf: array [0..15] of Char;
begin
try
Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], sizeof(pszBuf));
except end;
end;
procedure InitializeWizard();
begin
MsgBox(BytesToSize(GetFileSize('C:\Windows\regedit.exe')), mbInformation, MB_OK);
end;версия файла:
Код:
Код: Выделить всё
function FileVersion(FilePath:string):string;
var
oFS: Variant;
begin
oFS := CreateOleObject('Scripting.FileSystemObject');
Result := oFS.GetFileVersion(FilePath);
end;
procedure InitializeWizard();
begin
MsgBox((FileVersion('C:\Windows\regedit.exe')), mbInformation, MB_OK);
end;получение буквы жёсткого диска на которм лежит файл:
Код:
Код: Выделить всё
function GetFolserSize(FilePath:string):string;
var
oFS: Variant;
begin
oFS := CreateOleObject('Scripting.FileSystemObject');
Result := oFS.GetDriveName(FilePath);
end;
procedure InitializeWizard();
begin
MsgBox((GetFolserSize('C:\Windows\regedit.exe')), mbInformation, MB_OK);
end;генерирование уникального имени папки для использования её в %Temp%
Код:
Код: Выделить всё
function CreateFolserUniqueName:string;
var
oFS: Variant;
begin
oFS := CreateOleObject('Scripting.FileSystemObject');
Result := oFS.GetTempName;
end;
procedure InitializeWizard();
begin
MsgBox(CreateFolserUniqueName, mbInformation, MB_OK);
end;альтернатива функции DirExists:
Код:
Код: Выделить всё
function FolderExists(Folder:string):boolean;
var
oFS: Variant;
begin
oFS := CreateOleObject('Scripting.FileSystemObject');
Result := oFS.FolderExists(Folder);
end;
procedure InitializeWizard();
begin
if FolderExists('C:\setup') then MsgBox('ok', mbInformation, MB_OK);
end;проверка наличия жёсткого диска по букве:
Код:
Код: Выделить всё
function DriveExists(Drive:string):boolean;
var
oFS: Variant;
begin
oFS := CreateOleObject('Scripting.FileSystemObject');
Result := oFS.DriveExists(Drive);
end;
procedure InitializeWizard();
begin
if DriveExists('C') then MsgBox('ok', mbInformation, MB_OK);
end;