![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
10 000 000 -> 10 Mb
T2 © (2003-06-05 13:03:00)
Каким образо перевести байты (размер файла например) в Windows представление (byte,Mb,Gb). Использую встроенную функцию Windows, но после 4 Gb формат переводится не верно. Где ошибка?
{S} Function __SGuStrFormatByteSize(_dw:DWord;_pszBuf:PChar;_cchBuf:UINT):PChar;StdCall;External "shlwapi.dll" Name "StrFormatByteSizeA";
Ведь диски уже больше 4 Gb выпускают?
Palladin (2003-06-05 14:25:00) [21]
> McSimm © (05.06.03 14:00)
вопрос можно трактовать очень широко, и кто как хотел так его и понял...
я не буду поднимать вопрос о человеческом восприятии размытых вещей...
Palladin (2003-06-05 14:23:00) [22]ну блин, писал писал, все что уже написали :) и не запостили
function FormatByteValue(p_fBytes:extendet):string;
const
levels:array [1..5] of string =("b","Kb","Mb","Gb","Tb");
var
l,i:integer;
begin
for i:=1 to 5 do
begin
l:=i;
if p_fBytes<1023 then break
( p_fBytes,ffGeneral,4,2)ну блин, писал писал, все что уже написали :) и не запостили
function FormatByteValue(p_fBytes:extendet):string;
const
levels:array [1..5] of string =("b","Kb","Mb","Gb","Tb");
var
l,i:integer;
begin
for i:=1 to 5 do
begin
l:=i;
if p_fBytes<1023 then break
else p_fBytes:=p_fBytes/1024;
end;
result:=floattostrf(p_fBytes,ffGeneral,4,2)+levels[l];
end;
трюдно да?
T2 (2003-06-05 14:20:00) [23]
Это все мелочи. :)
Так как же мне решить этот вопрос?
Повторюсь:
StrFormatByteSize64 - пишет, точка входа не найдена
StrFormatByteSizeW - почемуто дает только 1 число - 6.8 Gb -> говорит 6.
Кстати, где об этих функциях прочитать можно?
Anatoly Podgoretsky (2003-06-05 14:13:00) [24]
Ну наверно если бы вопрос T2 © (05.06.03 13:03) был вместе с T2 © (05.06.03 13:56) и звучал бы примерно так:
Какой функцией мне вопользоваться вместо "StrFormatByteSizeA", поскольку это работает только до 4 гигабайт, то наверно этого орешника не было. Ну это уже к вопросу как правильно задавать вопросы.
Skier (2003-06-05 14:07:00) [25]
>McSimm © (05.06.03 14:00)
В исходном вопросе нет ни слова о "форматировании строки".
McSimm (2003-06-05 14:00:00) [26]
Вообще-то странно...
Вполне нормальный вопрос, к тому же абсолютно корректно заданный.
Вас ведь не спросили "подскажите функцию для перевода байтов в килобайты"
Если бы у человека возник вопрос по использованию функции
FormatDateTime(), вы бы на него накинулись?
"Ламер! Не знаешь как разбить TDateTime на составляющие" :)
>Зачем встроенные функции?
Действительно, зачем? Да еще так много. Надо как минимум половину выбросить нафиг.
>вот это да...
>меня вопрос поразил до костного мозга, не ужели такие еще есть...
Когда костный мозг подлечишь, попробуй понять суть вопроса. Потом попробуй на него ответить. Глядишь - изменишь мнение.
>Насколько я помню производители винчестеров считают кило, мега
Это абсолютно не в тему. Мало ли кто как считает - вопрос о форматировании строки.
Palladin (2003-06-05 13:58:00) [27]
в магазин за углом на такси катаемся?
T2 (2003-06-05 13:56:00) [28]
2 All
Да знаю я все это уже :)
Мне надо: получить стандартное отображение (Windows) размера файла (диска и т.п.) как в проводнике Windows.
1. Не хочу сам писать функцию (уже есть в Виндах).
2. Не хочу, чтоб моя функция и отображение Винов "расходились"
3. Интерестно разобраться со встоенной функцией.
T2 (2003-06-05 13:52:00) [29]
2 McSimm>
StrFormatByteSize64 - пишет, точка входа не найдена
StrFormatByteSizeW - почемуто дает только 1 число - 6.8 Gb -> говорит 6.
Кстати, где об этих функциях прочитать можно?
k-man (2003-06-05 13:50:00) [30]
> А вообще вопрос достоин "Орешника" - даже моя бабушка сможет
> перевести байты в килобайты и т.д.
согласен. Самое интересное что парень с высшим образованием.
Anatoly Podgoretsky (2003-06-05 13:45:00) [31]
T2 © (05.06.03 13:23)
Так тебе размер надо получить или перевести?
Если первое, то ты пользуешься не той штукой, если второе, то уже разжевали.
Skier (2003-06-05 13:42:00) [32]
>Palladin © (05.06.03 13:40)
Скорее всего так им считать проще :)
Palladin (2003-06-05 13:40:00) [33]
> Skier © (05.06.03 13:15)
есть такое :)
так размер больше получается...
DrPass (2003-06-05 13:38:00) [34]
... как объяснить ламеру, что такое байт?
- Восемь раз объяснить ему, что такое бит.
А как объяснить ламеру, что такое килобайт?
- Это слишком долго рассказывать...
А вообще вопрос достоин "Орешника" - даже моя бабушка сможет перевести байты в килобайты и т.д.
Skier (2003-06-05 13:35:00) [35]
>Игорь Шевченко © (05.06.03 13:32)
:))
Игорь Шевченко (2003-06-05 13:32:00) [36]
Из словаря:
MEGABYTE - американское название килобайта.
Anatoly Podgoretsky (2003-06-05 13:25:00) [37]
Skier © (05.06.03 13:15)
Так у них в метре 98 сантиметров.
"а в попугаях то я длиннее"
T2 © (05.06.03 13:03)
кило = 2^10
мега = кило^2
гига = кило^3
и так далее
McSimm (2003-06-05 13:23:00) [38]
Чтобы использовать числа > 2^32 используй
StrFormatByteSize64
или
StrFormatByteSizeW
В качестве параметра для них используй переменную Int64
T2 (2003-06-05 13:23:00) [39]
Все равно, даже если задать текущий диск (размер у которого более 4 Gb) в виде параметра (DiskSize(0)) - размер все равно даже близко не определяется.
Function Size(Sz:Int64):String;
Var Buf:Array[0..79] Of Char;
Begin
Result:=__SGuStrFormatByteSize(Sz,Buf,SizeOf(Buf));
End;
Для диска размером 7 Gb выдает 2.82 Gb
T2 (2003-06-05 13:17:00) [40]
Так надо ж еще определять границу перехода в следующий разряд (и к томуже - если есть встроенная - зачем свою писть).