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

Вниз

10 000 000 -> 10 Mb   Найти похожие ветки 

 
T2 ©   (2003-06-05 13:03) [0]

Каким образо перевести байты (размер файла например) в 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 выпускают?


 
[lamer]Barmaglot ©   (2003-06-05 13:10) [1]

Количество байт делишь на 1024 получаешь килобайты, делишь ещё на 1024 получаешь мегабаты и т.д. Зачем встроенные функции?


 
Palladin ©   (2003-06-05 13:13) [2]

вот это да...
меня вопрос поразил до костного мозга, не ужели такие еще есть...


 
Skier ©   (2003-06-05 13:15) [3]

>T2 © (05.06.03 13:03)
Насколько я помню производители винчестеров считают кило, мега
(и т. д.) байты по своему, т.е.

-1 Кбайт = 1000 байт
(в отличии от стандартного 1 Кбайт = 1024 байт )
-1 Мбайт = 1000 Кбайт
(в отличии от стандартного 1 Мбайт = 1024 Кбайт )

Так что __SGuStrFormatByteSize видимо работает правильно.


 
T2 ©   (2003-06-05 13:17) [4]

Так надо ж еще определять границу перехода в следующий разряд (и к томуже - если есть встроенная - зачем свою писть).


 
T2 ©   (2003-06-05 13:23) [5]

Все равно, даже если задать текущий диск (размер у которого более 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



 
McSimm ©   (2003-06-05 13:23) [6]

Чтобы использовать числа > 2^32 используй
StrFormatByteSize64
или
StrFormatByteSizeW

В качестве параметра для них используй переменную Int64


 
Anatoly Podgoretsky ©   (2003-06-05 13:25) [7]

Skier © (05.06.03 13:15)
Так у них в метре 98 сантиметров.
"а в попугаях то я длиннее"

T2 © (05.06.03 13:03)
кило = 2^10
мега = кило^2
гига = кило^3
и так далее


 
Игорь Шевченко ©   (2003-06-05 13:32) [8]

Из словаря:

MEGABYTE - американское название килобайта.


 
Skier ©   (2003-06-05 13:35) [9]

>Игорь Шевченко © (05.06.03 13:32)
:))


 
DrPass ©   (2003-06-05 13:38) [10]

... как объяснить ламеру, что такое байт?
- Восемь раз объяснить ему, что такое бит.
А как объяснить ламеру, что такое килобайт?
- Это слишком долго рассказывать...

А вообще вопрос достоин "Орешника" - даже моя бабушка сможет перевести байты в килобайты и т.д.


 
Palladin ©   (2003-06-05 13:40) [11]


> Skier © (05.06.03 13:15)

есть такое :)
так размер больше получается...


 
Skier ©   (2003-06-05 13:42) [12]

>Palladin © (05.06.03 13:40)
Скорее всего так им считать проще :)


 
Anatoly Podgoretsky ©   (2003-06-05 13:45) [13]

T2 © (05.06.03 13:23)
Так тебе размер надо получить или перевести?
Если первое, то ты пользуешься не той штукой, если второе, то уже разжевали.


 
k-man ©   (2003-06-05 13:50) [14]


> А вообще вопрос достоин "Орешника" - даже моя бабушка сможет
> перевести байты в килобайты и т.д.

согласен. Самое интересное что парень с высшим образованием.


 
T2 ©   (2003-06-05 13:52) [15]

2 McSimm>

StrFormatByteSize64 - пишет, точка входа не найдена

StrFormatByteSizeW - почемуто дает только 1 число - 6.8 Gb -> говорит 6.

Кстати, где об этих функциях прочитать можно?


 
T2 ©   (2003-06-05 13:56) [16]


2 All
Да знаю я все это уже :)

Мне надо: получить стандартное отображение (Windows) размера файла (диска и т.п.) как в проводнике Windows.
1. Не хочу сам писать функцию (уже есть в Виндах).
2. Не хочу, чтоб моя функция и отображение Винов "расходились"
3. Интерестно разобраться со встоенной функцией.


 
Palladin ©   (2003-06-05 13:58) [17]

в магазин за углом на такси катаемся?


 
McSimm ©   (2003-06-05 14:00) [18]

Вообще-то странно...
Вполне нормальный вопрос, к тому же абсолютно корректно заданный.

Вас ведь не спросили "подскажите функцию для перевода байтов в килобайты"

Если бы у человека возник вопрос по использованию функции
FormatDateTime(), вы бы на него накинулись?
"Ламер! Не знаешь как разбить TDateTime на составляющие" :)

>Зачем встроенные функции?
Действительно, зачем? Да еще так много. Надо как минимум половину выбросить нафиг.

>вот это да...
>меня вопрос поразил до костного мозга, не ужели такие еще есть...

Когда костный мозг подлечишь, попробуй понять суть вопроса. Потом попробуй на него ответить. Глядишь - изменишь мнение.

>Насколько я помню производители винчестеров считают кило, мега
Это абсолютно не в тему. Мало ли кто как считает - вопрос о форматировании строки.


 
Skier ©   (2003-06-05 14:07) [19]

>McSimm © (05.06.03 14:00)
В исходном вопросе нет ни слова о "форматировании строки".


 
Anatoly Podgoretsky ©   (2003-06-05 14:13) [20]

Ну наверно если бы вопрос T2 © (05.06.03 13:03) был вместе с T2 © (05.06.03 13:56) и звучал бы примерно так:
Какой функцией мне вопользоваться вместо "StrFormatByteSizeA", поскольку это работает только до 4 гигабайт, то наверно этого орешника не было. Ну это уже к вопросу как правильно задавать вопросы.



 
T2 ©   (2003-06-05 14:20) [21]

Это все мелочи. :)
Так как же мне решить этот вопрос?

Повторюсь:

StrFormatByteSize64 - пишет, точка входа не найдена

StrFormatByteSizeW - почемуто дает только 1 число - 6.8 Gb -> говорит 6.

Кстати, где об этих функциях прочитать можно?


 
Palladin ©   (2003-06-05 14:23) [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;

трюдно да?


 
Palladin ©   (2003-06-05 14:25) [23]


> McSimm © (05.06.03 14:00)

вопрос можно трактовать очень широко, и кто как хотел так его и понял...
я не буду поднимать вопрос о человеческом восприятии размытых вещей...


 
[lamer]Barmaglot ©   (2003-06-05 14:25) [24]

Человек хочет разобраться с функциями Windows... Пусть разбирается. Почитать можно как это не странно на msdn.microsoft.com в поле поиска вводишь функцию по которой хочешь почитать и читаешь...


 
Vulko ©   (2003-06-05 14:26) [25]


> Использую встроенную функцию Windows, но после 4 Gb формат
> переводится не верно

У тебя наверное Фат - он не поддерживает файлы бодьше 4 гигов.


 
T2 ©   (2003-06-05 14:31) [26]

2 Palladin>
Snx

2 Vulko>
Это ясно, но как тогда быть с размером винта?

2 [lamer]Barmaglot >
Snx, не знал..


 
[lamer]Barmaglot ©   (2003-06-05 14:33) [27]

Человек хочет разобраться с функциями Windows... Пусть разбирается. Почитать можно как это не странно на msdn.microsoft.com в поле поиска вводишь функцию по которой хочешь почитать и читаешь...


 
Anatoly Podgoretsky ©   (2003-06-05 14:34) [28]

Palladin © (05.06.03 14:23)
После его уточнения (2. Не хочу, чтоб моя функция и отображение Винов "расходились"), не стоило приводить собственную функцию, поскольку это может привести именно к этому самому расхождению и натурное испытание не поможет, надумает Микрософт мерить в попугаях и все насмарку, придется делать проверки на версии ОС и библиотеке. Подход у него правильный. Просто коряво он делал объяснение.

Vulko © (05.06.03 14:26)
К него другой вопрос.


 
Anatoly Podgoretsky ©   (2003-06-05 14:38) [29]

T2 © (05.06.03 14:31)
Использовать функцию GetDiskFreeSpaceEx


 
T2 ©   (2003-06-05 14:40) [30]

Всем спасибо - вопрос снят.


 
McSimm ©   (2003-06-05 15:09) [31]

>Palladin © (05.06.03 14:23)
>result:=floattostrf(p_fBytes,ffGeneral,4,2)+levels[l];
>трюдно да?

Если уж взялся, доводи до конца. Зачем использовать floattostrf??? Что, самому написать трудно?


 
[lamer]Barmaglot ©   (2003-06-05 15:16) [32]

то McSimm © (05.06.03 15:09)

Не надо так нервничать.

Palladin таким образом хотел показать, что чем пол часа расспрашивать всех в форуме, можно было за пять минут написать такую же процедуру самому...


 
Palladin ©   (2003-06-05 15:20) [33]

мда... цепляемся уже... Ваши зацепки не уместны...
мне не трудно, да и исходники в Sources...
не уместно сравнивать использование FloatToStrF и
Function __SGuStrFormatByteSize(_dw:DWord;_pszBuf:PChar;_cchBuf:UINT):PChar;StdCall;External "shlwapi.dll" Name "StrFormatByteSizeA";



 
McSimm ©   (2003-06-05 16:05) [34]


> Palladin таким образом хотел показать, что чем пол часа
> расспрашивать всех в форуме, можно было за пять минут написать
> такую же процедуру самому...

Во-первых, вы уверены, что такую же? Во-вторых, гораздо лучше один раз разобраться в возникшей проблеме и сделать корректно, чем за пол-часа найти обходной путь.


> не уместно сравнивать использование...

Почему?


 
Palladin ©   (2003-06-05 16:22) [35]

по причине их "веса" в общем коде и условий их исполнения...
вы мастер или где, или вы меня экзаменируете...
приведенное мною конечно ему не подойдет по причине Anatoly Podgoretsky © (05.06.03 14:34), а точнее по 2 пункту его хотелки...
я не буду с вами спорить, потому что он(спор) уже перешел на борьбу принципов, а это пустая трата времени...


 
McSimm ©   (2003-06-05 16:37) [36]


> приведенное мною конечно ему не подойдет по причине Anatoly
> Podgoretsky ©

Хотя бы по той простой причине, что вопрос был не тот. Человек задал корректный вопрос об использовании конкретной функции.

Не было вопроса как перевести быйты в мегабайты и.т.п. Был вопрос где ошибка в таком-то использовании функции. А ему рассказали, что использовать эту функцию глупо, что расчитывай и форматируй сам и т.п.


> я не буду с вами спорить, потому что

Однако задуматься стоит над своим безосновательным выпадом (05.06.03 13:13)
Бывают вопросы глупые. Бывают глупо сформулированные. Можно и посмеятся(без перехода на личности). Но тут-то все в порядке, а оказывается " не ужели такие еще есть...". Какие "такие"?

Вот это меня и задело.


 
Anatoly Podgoretsky ©   (2003-06-05 17:09) [37]

Ну успокоились горячие эстонские парни.


 
McSimm ©   (2003-06-05 17:12) [38]

:))


 
Palladin ©   (2003-06-05 20:48) [39]

:)


 
dRake ©   (2003-06-05 23:51) [40]

На вот тебе эту функцию, которую я сам юзаю в одной из своих прог
думаю разберёшься :)

function GetString( value : Int64) : string;
var temp : real;
begin

if value >= 1024*1024 then Begin;
temp := value/1024;
result := FloatToStrF(temp,ffGeneral,5,6) + " Kb";
end;

if (value > 1024*1024) and (value <= 1000*1024*1024) then Begin;
temp := value/(1024*1024);
result := FloatToStrF(temp,ffGeneral,5,6) + " Mb"
end;

if value > 1000*1024*1024 then Begin;
temp := Trunc(value/(1024*1024));
result := FloatToStrF(temp,ffGeneral,5,6) + " Gb"
end;
________________________________________________________

На вход даёшь ей значение в байтах
на выходе получаешь строку типа 10,23 Mb



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

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

Наверх




Память: 0.57 MB
Время: 0.019 c
1-68340
Alexey
2003-08-08 15:23
2003.08.21
Кодировка


14-68462
Nick-From
2003-08-06 14:46
2003.08.21
Internet Explorer


3-68188
Relaxxx
2003-07-28 17:21
2003.08.21
Изменение положения колонки в ДБГрид


3-68212
Magic&Wizard
2003-07-24 20:41
2003.08.21
КАК отловить, что запись в базе уже СУЩЕСТВУЕТ


3-68248
freemax
2003-07-25 14:49
2003.08.21
Как мне узнать в ДБГрид шырину определенной колонки??