Форум: "Потрепаться";
Текущий архив: 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