Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Тупой вопрос: как перевести байты в Кб, Мб? :)


Страницы:   1 2 3

Mental_Ray ©   (2004-07-24 19:49:00) 

Люди подскажите, на сколько нужно разделить кол-во байт, и с помощью какой функции можно округлить до сотых. :)


Mental_Ray   (2004-07-25 10:18:00) [41]

Юрий Зотов, ваш код намного компактнее моего, мне нравится, я его буду использовать :), Но... :(
Его показания также отличаются от Виновских, как и все предыдущие.
Я еще раз говорю:

Виндовс размер файла
Байты: 10617
КБ: 10,3

Ваш размер файла
Байты: 10617
После того как я разделил байты на 1024 получилось 10,3681640625
Потом это число округляется и получается
КБ: 10,4

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

Просто дайте функцию, которая ОТСЕКАЕТненужную часть дроби: было 10,3681640625, станет 10,3. Все просто.


Юрий Зотов   (2004-07-25 09:30:00) [42]

function FileSize(FName: string): string;
begin
 with TFileStream.Create(FName, fmOpenRead) do
 try
   case Size of
     0..1023:
       Result := Format('%d %s', [Size, 'байт']);
     1024...1024*1024-1:
       Result := Format('%0.1f %s', [Size/1024, 'Кб'])
     else
       Result := Format('%0.2f %s', [Size/1024/1024, 'Мб'])
   end
 finally
   Free
 end
end;


Mental_Ray   (2004-07-25 08:59:00) [43]

Piter, ты объяснил все ок, НО!
Все равно размер Винды отличается от моего:
мой 8,05 Мб
Винды 8,04 Мб

И я понял почему. Байты, разделенные на (1024*1024) нужно не округлять а просто показать с двумя цифрами после запятой! И отсюда вытекает логичный вопрос: какая функция это делает? :)
И еще, вот моя функция, которая вычисляет размер:


function FileSize(FName:string):string;
var
 fil: TFileStream;
 s: String;
begin
 fil:=TFileStream.Create(FName,fmOpenRead);
 s:=inttostr(fil.Size);
 case Length(s) of
   1..3:
     result:=inttostr(fil.Size)+' байт';
   4..6:
     result:=floattostr(RoundTo(fil.Size/1024,-1))+' Кб';
   7..9:
     result:=floattostr(RoundTo(fil.Size/(1024*1024),-2))+' Мб';
 end;
 fil.Free;
end;


Может я что-то напорол в функции не то?


Mental_Ray   (2004-07-25 08:34:00) [44]

Piter, если бы все так сразу объясняли! :) Спасибо!


Piter   (2004-07-25 01:04:00) [45]

Нда, тяжелый случай.

В одном килобайте 1024 байта. В одном мегабайте 1024 килобайта. Вроде все просто.

Тебе, допустим, известен размер файла в байтах Size. Соответственно, если ты разделишь:

Size/(1024*1024)- то получишь размер в мегабайтах. Чтобы округлить до нужного числа знаков после запятой используется функция RoundTo (смотри в справке Дельфи).
Например:

RoundTo(Size/(1024*1024) , -2)- получишь размер в мегабайтах, округленный до двух знаков после запятой. То есть так, как показывает Windows (опять же если Size - размер файла в байтах).

При этом не забывай, что windows NT показывает не только размер файла, но и сколько именно он занимает места на диске (с учетом разбиения диска на кластеры). Не путай эти два размера, второй больше или равен первому (который ты выясняешь).
Хотя различий в 0,2 Mb не должно быть, конечно. Не может быть кластет быть в 200 килобайт...

P.S. Ну вроде разжевал по самое не могу...


Mental_Ray   (2004-07-24 23:10:00) [46]

Согласен Магнитон Борыч, но как округлить число байт,Кб,Мб - чтобы размер совпадал с показаниями Винды???!!!
Если использовать то, что посоветовал GrayFace то размер не сходится с Виндовским!
Например:
Мой размер файла 8,24 Мб
Винда 8,04 МБ
:((


Магнитон Борыч   (2004-07-24 22:34:00) [47]

Число килобайт = число байт / 1024
Число мегабайт = число килобайт / 1024


Mental_Ray   (2004-07-24 22:09:00) [48]

Thanks GrayFaceоригинальный метод! Мне нравится :)
А вообще так, для интереса, есть какя-нибудь стандартная функция
типа
Округлить(дробное число, кол-во знаков после запятой)?
А то я Math перерыл и не нашел...


GrayFace   (2004-07-24 20:43:00) [49]

Округлить: умножить на 100, round, разделить на 100.


Mental_Ray   (2004-07-24 20:11:00) [50]

Афкорс! :))))


Anatoly Podgoretsky   (2004-07-24 20:07:00) [51]

Про мега не надо, сам сообразишь?


Mental_Ray   (2004-07-24 20:06:00) [52]

А когда-то я это помнил! :))


Anatoly Podgoretsky   (2004-07-24 19:57:00) [53]

2^10


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо