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

Вниз

Американская винда не правильно определяет кол-во   Найти похожие ветки 

 
Layner ©   (2004-09-27 11:21) [0]

свободного места на диске! Определяю ф-й DiskFree, код ниже. На русских без проблем, на американской определяет в 1000 раз меньше. Т.е. если на диске есть 700мег свободного места, она пишет, 700кб.

var
var
FDriveC : string;
FFreeDriveC : string;
di      : Int64;
begin
//определение размера всего диска С, тут верно
di := DiskSize(3);  
if di <> -1 then
 FDriveC := Format("%d KB", [di div 1048576])
else
 FDriveC := "";

//определение свободного места на диске С, тут в амер. не верно, в русской верно :(
di := DiskFree(3);  
if di <> -1 then
 FFreeDriveC := Format("%d KB", [di div 1048576])
else
 FFreeDriveC := "";
end;

Понятно, что в случае с американской виндой, разделить не на это 1048576, а на 1048, и будет верный рез. Но хочется понять, почему возвращается не верный результат, и второе, вдруг эта ф-я так же не работает в немецкой и т.п. версиях?


 
Nikolay M. ©   (2004-09-27 12:50) [1]

1) А почему ты делишь таки на 1048576? 1 КБ = 1024 байт.
2) Для корректоного определения размера свободного места на дисках размером > 2Гб нужно вызывать одноименную ф-ю модуля DOS (WinDOS кажется).


 
Layner ©   (2004-09-27 12:57) [2]

Для корректоного определения размера свободного места на дисках размером > 2Гб
почему ты делишь таки на 1048576? 1 КБ = 1024 байт.

Николай, так на любой русской винде все замечательно работает! И показывает верный результат. Т.е. выходит, я правильно делю на 1048576 Не понятно, почему не работает именно на американской. Или тогда почему на русской отображает корректно, не понятно.


 
Fay ©   (2004-09-27 13:01) [3]

Не пробовали?
BOOL GetDiskFreeSpace(
 LPCTSTR lpRootPathName,          // root path
 LPDWORD lpSectorsPerCluster,     // sectors per cluster
 LPDWORD lpBytesPerSector,        // bytes per sector
 LPDWORD lpNumberOfFreeClusters,  // free clusters
 LPDWORD lpTotalNumberOfClusters  // total clusters
);


 
Nikolay M. ©   (2004-09-27 13:02) [4]


> почему на русской отображает корректно, не понятно.

Нефиг пользоваться русскими копиями виндов. Если уж хочется русского: MUI в руки.
См. п.2.


 
Layner ©   (2004-09-27 13:05) [5]

Нефиг пользоваться русскими копиями виндов.
нефиг впаривать русские копии виндов при покупке ноутбуков. :)


 
Fay ©   (2004-09-27 13:05) [6]

Мне не понятно. Функция DiskFree возвращает результат в единицах, равных 1/1024 байта? Бредятина.


 
Nikolay M. ©   (2004-09-27 13:06) [7]


> Layner ©   (27.09.04 13:05) [5]
> Нефиг пользоваться русскими копиями виндов.
> нефиг впаривать русские копии виндов при покупке ноутбуков.
> :)

Нефиг покупать ноутбуки с впаренными русскими копиями виндов :)


 
Layner ©   (2004-09-27 13:06) [8]

Fay ©   (27.09.04 13:01)
Нет, сейчас опробую :) Спасибо.


 
PVOzerski ©   (2004-09-27 13:06) [9]

А с сервис-паками ситуация одинакова? И на D3 ты там нигде не компилировал?


 
Layner ©   (2004-09-27 13:07) [10]

Нефиг покупать ноутбуки с впаренными русскими копиями виндов :)
Где покупать ноутбуки без впаренной версии руской винды? :)


 
Layner ©   (2004-09-27 13:08) [11]

PVOzerski ©   (27.09.04 13:06)нет, только на D7.
Кто не верит, могу привести полный код определения размера полного/free диска С. Сейчас.


 
PVOzerski ©   (2004-09-27 13:14) [12]

>Где покупать ноутбуки без впаренной версии руской винды? :)
Позавчера видел в "М-Видео" и "Компьютерном Мире" на "Ладожской" (в Питере) - в одном случае XP Home Eng на Toshiba, в другом - Linux не помню на чем. Но судя по всему, у автора ветки NT4 (исходя из названия ее дубля в "Основной" ;^) ).

Кстати, приведенный код выдал у меня 59К вместо 59M (Server Eng SP6a revised).


 
Layner ©   (2004-09-27 13:16) [13]

Вернее, DiskSize и DiskFree (а не одна DiskFree, мой не досмотр) работают корректно в русской винде, когда делим на 1048576, и получается в КБ, и 1024 в американской винде (что в принципе верно).
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
FDriveC : string;
FFreeDriveC : string;
di      : Int64;
begin

di := DiskSize(3);
if di <> -1 then
FDriveC := Format("%d KB", [di div 1048576])
else
FDriveC := "";

di := DiskFree(3);
if di <> -1 then
FFreeDriveC := Format("%d KB", [di div 1048576])
else
FFreeDriveC := "";

Label1.Caption:=FDriveC;
Label2.Caption:=FFreeDriveC;

end;

Только что прогонял на русской/американской. Результат отличается в 1000 раз.


 
Layner ©   (2004-09-27 13:17) [14]

Но судя по всему, у автора ветки NT4.
На ноуте XP Home русская, на работе NT4-2000-2003, как англ, так и русские.


 
PVOzerski ©   (2004-09-27 13:18) [15]

Осталось разобраться, кто дурак - Винда или VCL...


 
Layner ©   (2004-09-27 13:18) [16]

Toshiba.... хм.. она и стоит то :) Не, нам тошибу не надо. Мы и асусом обойдемся :)


 
Layner ©   (2004-09-27 13:19) [17]

PVOzerski ©   (27.09.04 13:18)
3го варианта не будет? :)


 
PVOzerski ©   (2004-09-27 13:30) [18]

procedure TForm1.Button2Click(Sender: TObject);
var
 df1,df2:int64;
 p1,p2,p3,p4:dword;
begin
 df1:=DiskFree(3);
 GetDiskFreeSpace("c:\",p1,p2,p3,p4);
 df2:=int64(p3)*int64(p1)*int64(p2);
 ShowMessage(inttostr(df1 div 1024 div 1024)+" "+inttostr(df1 div 1024 div 1024));
end;

В общем, я и на API, и на VCL свои 59. При этом деля 1-й раз на 1024, я перешел к килобайтам, а 2-й раз - к мегабайтам. Т.е. 59 мегабайт, как и должно было быть.
Может, просто
>FFreeDriveC := Format("%d KB", [di div 1048576])
исправить на
FFreeDriveC := Format("%d MB", [di div 1048576])
? :^)


 
Vit@ly ©   (2004-09-27 13:44) [19]

Fay ©   (27.09.04 13:01) [3] и
PVOzerski ©   (27.09.04 13:30) [18]
дают верный путь, а не проще (короче) ли:
GetDiskFreeSpaceEx(PChar("C:\"), Free_size, Total_size, nil);
ну а
Format("%d KB".... или
ShowMessage(...
как удобнее


 
Игорь Шевченко ©   (2004-09-27 13:59) [20]

Nikolay M. ©   (27.09.04 13:02) [4]


> Нефиг пользоваться русскими копиями виндов.


Ты пояснишь глубокую мысль ?


 
Nikolay M. ©   (2004-09-27 14:03) [21]


> Ты пояснишь глубокую мысль ?



> копиями

читать как "версиями" :)
Чегой-то у меня в понедельник с языком - заплетается :)


 
Игорь Шевченко ©   (2004-09-27 14:12) [22]

Nikolay M. ©   (27.09.04 14:03) [21]


> читать как "версиями" :)


То есть, не стоит пользоваться русскими версиями Windows, если я тебя правильно понял.

Тогда два раза поясни глубокую мысль.


 
Layner ©   (2004-09-27 14:31) [23]

Люди, вы будите смеятся, но этот работающий на русской, не работает на англ, и наобот. (с доработкой от [19] Vit@ly ©   (27.09.04 13:44), она так же кажет как и верх код). Т.е. выход такой, если русская винда, буду подставлять 1048576, если другая, 1024.


procedure TForm1.FormCreate(Sender: TObject);
var
   FDriveC : string;
FFreeDriveC : string;
        di : Int64;
Free_size, Total_size : Int64;
begin
{*********************************************}
di := DiskSize(3);
if di <> -1 then
FDriveC := Format("%d KB", [di div 1048576])
else
FDriveC := "";
{*********************************************}
di := DiskFree(3);
if di <> -1 then
FFreeDriveC := Format("%d KB", [di div 1048576])
else
FFreeDriveC := "";
{*********************************************}
Label1.Caption:=FDriveC;
Label2.Caption:=FFreeDriveC;
{*********************************************}
GetDiskFreeSpaceEx(PChar("C:\"), Free_size, Total_size, nil);
Label3.Caption:=Format("%d KB", [Total_size div 1048576]);
Label4.Caption:=Format("%d KB", [Free_size div 1048576]);
end;


 
Layner ©   (2004-09-27 15:00) [24]

Вопрос возник, как узнать локализацию Windows?


 
Fay ©   (2004-09-27 15:06) [25]

2 Layner ©   (27.09.04 14:31) [23]
>> Total_size div 1048576
Для того, чтобы получались килобайты, Total_size должен быть в 1024-х долях байта.


 
Layner ©   (2004-09-27 15:16) [26]

Это понятно, но это например
Label3.Caption:=Format("%d KB", [Total_size div 1024]);
будет не правильно казать на русской винде.


 
КаПиБаРа ©   (2004-09-28 06:49) [27]

Layner ©   (27.09.04 15:16) [26]

Чему равно Free_size на русской и не русской OS без всяких div"ов и форматов? Просто посмотри значения 8 байт.

================================================================
Мы являемся свидетелями процессов  определённого типа
только потому, что процессы иного типа протекают без свидетелей.
(А.Зельманов)
================================================================


 
Fay ©   (2004-09-28 19:27) [28]

2 Layner ©
Ну так как поживает GetDiskFreeSpace?


 
Layner ©   (2004-09-29 09:23) [29]

[28] Fay ©   (28.09.04 19:27)
Все, разобрался, спасибо! Только эта процедура GetDiskFreeSpace корректно работает на русской винде, и остальных. Только что проверял. Остальными пользоваться не рекомендую. Почему - не знаю. Просто кажет не верный результат.

procedure TForm1.Button1Click(Sender: TObject);
var
d1, d2, d3, d4: longword;
ddd  : integer;
begin
 ddd := 1024;
 GetDiskFreeSpace(PChar("C:\"), d1, d2, d3, d4); //lpRootPathName
 Memo1.Lines.Add(FloatToStr(d1)); //lpSectorsPerCluster
 Memo1.Lines.Add(FloatToStr(d2)); //lpBytesPerSector
 Memo1.Lines.Add(FloatToStr(d3)); //lpNumberOfFreeClusters
 Memo1.Lines.Add(FloatToStr(d4)); //lpTotalNumberOfClusters
 Memo1.Lines.Add(Format("%d KB", [(d1*d2*d3) div ddd]));
end;



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

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

Наверх




Память: 0.55 MB
Время: 0.041 c
11-1081592320
Delphi5.01
2004-04-10 14:18
2004.10.17
Вот такая странность замечается с KOL


3-1095676973
slaviq
2004-09-20 14:42
2004.10.17
Помогите решить проблемму table read only


1-1096553547
ser_ega
2004-09-30 18:12
2004.10.17
FileSizeByName


6-1092235218
Павел
2004-08-11 18:40
2004.10.17
Динамические массивы.


8-1090389409
Игорь Н.
2004-07-21 09:56
2004.10.17
Как засунуть .bmp внутрь .exe шника?