Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.06;
Скачать: CL | DM;

Вниз

Как узнать реальный объём занимаемый файлом на диске...   Найти похожие ветки 

 
Knight ©   (2005-02-22 20:22) [0]

Есть ли готовая функция? Или самому надо считать?


 
Юрий Зотов ©   (2005-02-22 20:30) [1]

В смысле - с учетом размера кластера?


 
Anatoly Podgoretsky ©   (2005-02-22 20:33) [2]

Уточни вопрос, а то много толкований, да и вопрос не такой простой как кажется.


 
Knight ©   (2005-02-22 20:50) [3]


> [1] Юрий Зотов ©   (22.02.05 20:30)
> В смысле - с учетом размера кластера?

Да.


 
Anatoly Podgoretsky ©   (2005-02-22 20:53) [4]

Размер кластера можно получить через АПИ функцию GetDiskFreeSpace


 
Anatoly Podgoretsky ©   (2005-02-22 20:56) [5]

Но как я сказал не все так просто, если стоит достаточно продвинутая ОС, то файлы могут быть сжаты или вообще не занимать ни одного кластера, речь идет о платформе НТ


 
Knight ©   (2005-02-22 20:57) [6]


> [4] Anatoly Podgoretsky ©   (22.02.05 20:53)
> Размер кластера можно получить через АПИ функцию GetDiskFreeSpace

Как данные получить для того, чтобы своими руками посчитать - это я найду... но неужели ничего такого нет? А то так пишешь-пишешь... а потом в какой-нить юнит влезешь, а там это уже есть...


 
Knight ©   (2005-02-22 20:58) [7]


> [5] Anatoly Podgoretsky ©   (22.02.05 20:56)
> Но как я сказал не все так просто, если стоит достаточно
> продвинутая ОС, то файлы могут быть сжаты или вообще не
> занимать ни одного кластера, речь идет о платформе НТ

Вот в том-то и дело...


 
Anatoly Podgoretsky ©   (2005-02-22 20:59) [8]

Knight ©   (22.02.05 20:57) [6]
Есть в MSDN


 
Knight ©   (2005-02-22 21:03) [9]


> [8] Anatoly Podgoretsky ©   (22.02.05 20:59)
> Есть в MSDN

Жаль, что MSDN у меня только онлайном... :(


 
Knight ©   (2005-02-22 21:04) [10]

Дайте хотя бы какой-то ориентир...


 
Anatoly Podgoretsky ©   (2005-02-22 21:33) [11]

ну первую опорную точку ты уже получил GetDiskFreeSpace, возможно и стоит ей ограничиться.


 
Knight ©   (2005-02-22 22:29) [12]

Как же всё запущено...


 
Anatoly Podgoretsky ©   (2005-02-22 22:48) [13]

Ну даже Виндоус не показывает этой информации, а ограничивается виртуальным кластером. Видимо это слишком глубоко в ядре зарыто.


 
Anatoly Podgoretsky ©   (2005-02-22 22:49) [14]

Кстати, чтобы тебе окончательно задурить голову, вспомни еще и про альтернативные потоки файла, их длина тоже не показывается.


 
Knight ©   (2005-02-22 22:55) [15]

:(

Убедил... буду считать сам по размеру кластера... пусть примерно, зато всё-равно больше чем реальный... :)


 
Anatoly Podgoretsky ©   (2005-02-22 23:00) [16]

Это же хорошо. Так больше напугаешь. :-)


 
Knight ©   (2005-02-22 23:03) [17]

На что и расчитано... :)


 
Anatoly Podgoretsky ©   (2005-02-22 23:06) [18]

Эх еще бы альтернативные потоки добавить.
Есть одна идея делаешь два расчета один с помощью GetDiskFreeSpace И суммирования размеров/кластеров, второй с помощью GetDiskFreeSpaceEx и смотришь на погрешность.


 
Knight ©   (2005-02-22 23:20) [19]

Идея в том, чтобы при сканировании папки (например, с дистрибутом, мелкими утилитами или текстовичками) подсчитывать реальный объём файлов и занимаемый на диске... если разница превышает пороговое значение, указанное пользователем в настройках проги, то выводить предложение произвести архивацию со сжатием или без, для уменьшения впустую занимаемого места...


 
GanibalLector ©   (2005-02-23 01:43) [20]

Постил уже раз десять ;)

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.



 
Чапаев ©   (2005-02-23 11:38) [21]

> Кстати, чтобы тебе окончательно задурить голову, вспомни еще и > про альтернативные потоки файла, их длина тоже не показывается.
Свойства файла -> Место на диске -- там размер указывается с учётом потоков (но без учёта сжатия, хе-хе).


 
Anatoly Podgoretsky ©   (2005-02-23 12:16) [22]

Чапаев ©   (23.02.05 11:38) [21]
Вот теперь окончательно задурил голову, будем надеятся, что Knight переживет :-)


 
Knight ©   (2005-02-23 14:50) [23]


> [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;


 
Knight ©   (2005-02-23 14:52) [24]


> [22] Anatoly Podgoretsky ©   (23.02.05 12:16)
> будем надеятся, что Knight переживет :-)

Что со мной будет? Я ж железный... :)))


 
Knight ©   (2005-02-23 15:48) [25]

Чё-то я сегодня промахиваюсь часто... то пост не туда запостю... а тут строчку не туда загнал... :)

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;


 
GanibalLector ©   (2005-02-24 01:45) [26]

2 Knight ©   (23.02.05 15:48) [25]
>А чем так плохо?
Начинается...Че пристал? Как хочешь,так и делай.


 
Knight ©   (2005-02-24 01:52) [27]


> [26] GanibalLector ©   (24.02.05 01:45)
> >А чем так плохо?
> Начинается...Че пристал? Как хочешь,так и делай.

А я чё? Я ни чё... просто странно показалось... константы какие-то... :)


 
Knight ©   (2005-02-24 01:55) [28]

Да... всем спасибо :)



Страницы: 1 вся ветка

Текущий архив: 2005.03.06;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.049 c
6-1104256698
ingine
2004-12-28 20:58
2005.03.06
TclientSocket


14-1108457078
Franzy
2005-02-15 11:44
2005.03.06
Не ставится Win98


1-1108027284
eropkin
2005-02-10 12:21
2005.03.06
Порекомендуйте учебник по Delphi


1-1108965031
VAV
2005-02-21 08:50
2005.03.06
EditControl


14-1108387652
Antonn
2005-02-14 16:27
2005.03.06
Задолбала пятисотка!