Текущий архив: 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.54 MB
Время: 0.01 c