![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Тупой вопрос: как перевести байты в Кб, Мб? :)
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