El Sanchez,
помню спрашивал как быстро определить размер папки (те для меня пример ...\Inno Setup 5\Scripts\Dobrov\DirSizeCal.iss работает слишком медленно)
нашёл пример использующий объект FileSystemObject
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
на форуме
http://forum.vingrad.ru/forum/topic-84976/unread-1.html
результат - функция (здесь вывод в мегабайтах под мои нужды) :
Код:
[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;