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

Вниз

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

Наверх





Память: 0.54 MB
Время: 0.01 c
1-68262
Man
2003-08-06 13:21
2003.08.21
защита от несанкционированного копирования


6-68429
Alex134
2003-06-16 20:09
2003.08.21
скачать программно файл с HTTP-сервера


7-68561
_ALEXey_
2003-06-06 09:19
2003.08.21
Информация по раскладкам клавиатуры


3-68163
Rulya
2003-07-29 17:30
2003.08.21
Пароли БД


1-68311
Nucl
2003-08-01 10:58
2003.08.21
Скины





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