Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.058 c
14-1108122411
Иксик2
2005-02-11 14:46
2005.03.06
Я так не играю


1-1108972798
Zhekson
2005-02-21 10:59
2005.03.06
Борланд Паскаль 7 и Мьютекс


3-1107707843
Eraser
2005-02-06 19:37
2005.03.06
Edit.........Post и синхронизация вызовов


14-1108508124
GanibalLector
2005-02-16 01:55
2005.03.06
Дайджесты форумов


10-1085072175
Grihan
2004-05-20 20:56
2005.03.06
CorelDraw





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский