![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать реальный объём занимаемый файлом на диске...
Knight © (2005-02-22 20:22:00)Есть ли готовая функция? Или самому надо считать?
Knight (2005-02-24 01:55:00) [1]Да... всем спасибо :)
Knight (2005-02-24 01:52:00) [2]
> [26] GanibalLector © (24.02.05 01:45)
> >А чем так плохо?
> Начинается...Че пристал? Как хочешь,так и делай.
А я чё? Я ни чё... просто странно показалось... константы какие-то... :)
GanibalLector (2005-02-24 01:45:00) [3]2 Knight © (23.02.05 15:48) [25]
>А чем так плохо?
Начинается...Че пристал? Как хочешь,так и делай.
Knight (2005-02-23 15:48:00) [4]Чё-то я сегодня промахиваюсь часто... то пост не туда запостю... а тут строчку не туда загнал... :)
procedure TForm1.FormCreate(Sender: TObject);
var QQ:DWord;
DriveCh:Char;
begin
QQ:=GetLogicalDrives();
DriveCh:='A';
while QQ>0 do begin
if (QQ mod 2)=1 then Combobox1.Items.Add(DriveCh+':\');
Inc(DriveCh);
QQ:=QQ div 2;
end;
end;
Knight (2005-02-23 14:52:00) [5]
> [22] Anatoly Podgoretsky © (23.02.05 12:16)
> будем надеятся, что Knight переживет :-)
Что со мной будет? Я ж железный... :)))
Knight (2005-02-23 14:50:00) [6]
> [20] GanibalLector © (23.02.05 01:43)
> procedure TForm1.FormCreate(Sender: TObject);
> var QQ,i:DWord;
> begin
> QQ:=GetLogicalDrives();
> for i:=1 to 26 do
> if (QQ and DriveConst[i])>0 then
> Combobox1.Items.Add(chr($40+i)+':\');
> end;
А чем так плохо?
procedure TForm1.FormCreate(Sender: TObject);
var QQ:DWord;
DriveCh:Char;
begin
QQ:=GetLogicalDrives();
DriveCh:='A';
while QQ>0 do begin
if (QQ mod 2)=1 then begin
Combobox1.Items.Add(DriveCh+':\');
Inc(DriveCh);
end;
QQ:=QQ div 2;
end;
end;
Anatoly Podgoretsky (2005-02-23 12:16:00) [7]Чапаев © (23.02.05 11:38) [21]
Вот теперь окончательно задурил голову, будем надеятся, что Knight переживет :-)
Чапаев (2005-02-23 11:38:00) [8]> Кстати, чтобы тебе окончательно задурить голову, вспомни еще и > про альтернативные потоки файла, их длина тоже не показывается.
Свойства файла -> Место на диске -- там размер указывается с учётом потоков (но без учёта сжатия, хе-хе).
GanibalLector (2005-02-23 01:43:00) [9]Постил уже раз десять ;)
const
DriveConst: array[1..26] of DWord =
($1, $2, $4, $8,
$10, $20, $40, $80,
$100, $200, $400, $800,
$1000, $2000, $4000, $8000,
$10000, $20000, $40000, $80000,
$100000, $200000, $400000, $800000,
$1000000, $2000000);
type
TForm1 = class(TForm)
ComboBox1: TComboBox;
Label1: TLabel;
Bevel1: TBevel;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var QQ,i:DWord;
begin
QQ:=GetLogicalDrives();
for i:=1 to 26 do
if (QQ and DriveConst[i])>0 then
Combobox1.Items.Add(chr($40+i)+':\');
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
var st:string;
VolumeName,FileSystemName : array [0..MAX_PATH-1] of Char;
VolumeSerialNumber,MaximumComponentLength,FileSystemFlags:DWord;
SectorsPerCluster,BytesPerSector,NumberOfFreeClusters,TotalNumberOfClusters:DWord;
begin
SetErrorMode(SEM_FAILCRITICALERRORS);
case GetDriveType(PChar(Combobox1.Text)) of
0: st:='Type :'+chr(09)+chr(09)+chr(09)+'Unknown'+#10#13;
1: st:='Type :'+chr(09)+chr(09)+chr(09)+'No_ROOT_DIR'+#10#13; // if RootPathName=nil
DRIVE_REMOVABLE: st:='Type :'+chr(09)+chr(09)+chr(09)+'Flopy'+#10#13;
DRIVE_FIXED: st:='Type :'+chr(09)+chr(09)+chr(09)+'Hard'+#10#13;
DRIVE_REMOTE: st:='Type :'+chr(09)+chr(09)+chr(09)+'Remote'+#10#13;
DRIVE_CDROM : st:='Type :'+chr(09)+chr(09)+chr(09)+'CD-ROM'+#10#13;
DRIVE_RAMDISK: st:='Type :'+chr(09)+chr(09)+chr(09)+'RAM-Disk'+#10#13;end;
st:=st+#10#13;
if GetVolumeInformation(Pchar(Combobox1.Text),VolumeName,MAX_PATH,
@VolumeSerialNumber,MaximumComponentLength,FileSystemFlags,FileSystemName,MAX_PATH)=true then
begin
st:=st+'Name :' +chr(09)+chr(09)+chr(09)+VolumeName+#10#13;
st:=st+'Serial :' +chr(09)+chr(09)+chr(09)+inttohex(VolumeSerialNumber,8)+#10#13;
st:=st+'Length :' +chr(09)+chr(09) +inttostr(MaximumComponentLength)+#10#13;
st:=st+'File system :'+chr(09)+chr(09) +FileSystemName+#10#13;
end
else st:=st+'Drive not ready'+#10#13; //ShowMessage(SysErrorMessage(GetLastError));
st:=st+#10#13;
if GetDiskFreeSpace(Pchar(Combobox1.Text),SectorsPerCluster,
BytesPerSector,NumberOfFreeClusters,TotalNumberOfClusters)=true then
begin
st:=st+'SectorsPerCluster :'+chr(09)+inttostr(SectorsPerCluster)+#10#13;
st:=st+'BytesPerSector : '+chr(09)+inttostr(BytesPerSector)+#10#13;
st:=st+#10#13;
st:=st+'FreeClusters : '+chr(09)+chr(09)+inttostr(NumberOfFreeClusters)+#10#13;
st:=st+'BusyClusters :'+chr(09)+chr(09)+inttostr(TotalNumberOfClusters-NumberOfFreeClusters)+#10#13;
st:=st+'TotalClusters :'+chr(09)+chr(09)+inttostr(TotalNumberOfClusters)+#10#13;
st:=st+#10#13;
st:=st+'FreeBytes :'+chr(09)+chr(09)+inttostr(NumberOfFreeClusters*(Int64(BytesPerSector*SectorsPerCluster)))+#10#13;
st:=st+'Busy :'+chr(09)+chr(09)+chr(09)+inttostr(TotalNumberOfClusters*(Int64(BytesPerSector*SectorsPerCluster))-
NumberOfFreeClusters*(Int64(BytesPerSector*SectorsPerCluster)))+#10#13;
st:=st+'TotalBytes :'+chr(09)+chr(09)+inttostr(TotalNumberOfClusters*(Int64(BytesPerSector*SectorsPerCluster)))+#10#13;
end;
messagedlg(Pchar(st),MtInformation,[MbOk],0);
end;
end.
Knight (2005-02-22 23:20:00) [10]Идея в том, чтобы при сканировании папки (например, с дистрибутом, мелкими утилитами или текстовичками) подсчитывать реальный объём файлов и занимаемый на диске... если разница превышает пороговое значение, указанное пользователем в настройках проги, то выводить предложение произвести архивацию со сжатием или без, для уменьшения впустую занимаемого места...
Anatoly Podgoretsky (2005-02-22 23:06:00) [11]Эх еще бы альтернативные потоки добавить.
Есть одна идея делаешь два расчета один с помощью GetDiskFreeSpace И суммирования размеров/кластеров, второй с помощью GetDiskFreeSpaceEx и смотришь на погрешность.
Knight (2005-02-22 23:03:00) [12]На что и расчитано... :)
Anatoly Podgoretsky (2005-02-22 23:00:00) [13]Это же хорошо. Так больше напугаешь. :-)
Knight (2005-02-22 22:55:00) [14]:(
Убедил... буду считать сам по размеру кластера... пусть примерно, зато всё-равно больше чем реальный... :)
Anatoly Podgoretsky (2005-02-22 22:49:00) [15]Кстати, чтобы тебе окончательно задурить голову, вспомни еще и про альтернативные потоки файла, их длина тоже не показывается.
Anatoly Podgoretsky (2005-02-22 22:48:00) [16]Ну даже Виндоус не показывает этой информации, а ограничивается виртуальным кластером. Видимо это слишком глубоко в ядре зарыто.
Knight (2005-02-22 22:29:00) [17]Как же всё запущено...
Anatoly Podgoretsky (2005-02-22 21:33:00) [18]ну первую опорную точку ты уже получил GetDiskFreeSpace, возможно и стоит ей ограничиться.
Knight (2005-02-22 21:04:00) [19]Дайте хотя бы какой-то ориентир...
Knight (2005-02-22 21:03:00) [20]
> [8] Anatoly Podgoretsky © (22.02.05 20:59)
> Есть в MSDN
Жаль, что MSDN у меня только онлайном... :(