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

Вниз

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

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

Наверх




Память: 0.52 MB
Время: 0.132 c
6-1091628568
IceClimber
2004-08-04 18:09
2004.10.17
Как узнать объем винта на другой машине (в локал. сети)


14-1095882283
тихий вовочка
2004-09-22 23:44
2004.10.17
Интерактивная карта


1-1096388114
pavelgr
2004-09-28 20:15
2004.10.17
работа с реестром


3-1095431746
Volodya_
2004-09-17 18:35
2004.10.17
Resync


1-1096382476
Antonmm2
2004-09-28 18:41
2004.10.17
Функции





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский