Текущий архив: 2004.08.08;
Скачать: CL | DM;
ВнизТупой вопрос: как перевести байты в Кб, Мб? :) Найти похожие ветки
← →
Mental_Ray © (2004-07-24 19:49) [0]Люди подскажите, на сколько нужно разделить кол-во байт, и с помощью какой функции можно округлить до сотых. :)
← →
Anatoly Podgoretsky © (2004-07-24 19:57) [1]2^10
← →
Mental_Ray © (2004-07-24 20:06) [2]А когда-то я это помнил! :))
← →
Anatoly Podgoretsky © (2004-07-24 20:07) [3]Про мега не надо, сам сообразишь?
← →
Mental_Ray © (2004-07-24 20:11) [4]Афкорс! :))))
← →
GrayFace © (2004-07-24 20:43) [5]Округлить: умножить на 100, round, разделить на 100.
← →
Mental_Ray © (2004-07-24 22:09) [6]Thanks GrayFace оригинальный метод! Мне нравится :)
А вообще так, для интереса, есть какя-нибудь стандартная функция
типа
Округлить(дробное число, кол-во знаков после запятой)?
А то я Math перерыл и не нашел...
← →
Магнитон Борыч (2004-07-24 22:34) [7]Число килобайт = число байт / 1024
Число мегабайт = число килобайт / 1024
← →
Mental_Ray © (2004-07-24 23:10) [8]Согласен Магнитон Борыч, но как округлить число байт,Кб,Мб - чтобы размер совпадал с показаниями Винды???!!!
Если использовать то, что посоветовал GrayFace то размер не сходится с Виндовским!
Например:
Мой размер файла 8,24 Мб
Винда 8,04 МБ
:((
← →
Piter © (2004-07-25 01:04) [9]Нда, тяжелый случай.
В одном килобайте 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-25 08:34) [10]Piter, если бы все так сразу объясняли! :) Спасибо!
← →
Mental_Ray © (2004-07-25 08:59) [11]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;
Может я что-то напорол в функции не то?
← →
Юрий Зотов © (2004-07-25 09:30) [12]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 10:18) [13]Юрий Зотов, ваш код намного компактнее моего, мне нравится, я его буду использовать :), Но... :(
Его показания также отличаются от Виновских, как и все предыдущие.
Я еще раз говорю:
Виндовс размер файла
Байты: 10617
КБ: 10,3
Ваш размер файла
Байты: 10617
После того как я разделил байты на 1024 получилось 10,3681640625
Потом это число округляется и получается
КБ: 10,4
Отсюда видно, что нужно не округлять число, а просто отсекать дробную часть после десятых, и тогда размер идеально совпадет с размером Винды. :)
Просто дайте функцию, которая ОТСЕКАЕТ ненужную часть дроби: было 10,3681640625, станет 10,3. Все просто.
← →
Mim1 © (2004-07-25 10:21) [14]Trunc отсекает.
Можно утножить на 10^x чтобы отсечь нужную часть.
← →
Mental_Ray © (2004-07-25 11:23) [15]Смотри Mim1:
берем размер в байтах 8 441 343
делим на 1048576 (1048576=1024*1024)
получаем 8,05029201507568359375
умножаем на 100
получаем 805,029201507568359375
транк!
получаем 805
делим на 100
и...! получаем 8,05 Мб! Вроде все правильно?! Тогда почему тупая винда показывает 8,04 Мб???!!!!
Ладно, черт с ним, я думаю такое отклонение не страшно :)
← →
Anatoly Podgoretsky © (2004-07-25 11:32) [16]А почему ты умножаешь на 100, а не 102.
Для сравнения 1.5 это не 1500, а 1024+512
← →
Sun bittern © (2004-07-25 11:37) [17]Сколько вешать байтов? :)
← →
DiamondShark © (2004-07-25 15:39) [18]Ух ты, блин! Новая единица измерения: виндовые килобайты ;)
← →
Юрий Зотов © (2004-07-25 16:25) [19]Обязательно нужно, чтобы обсуждение этого серьезнейшего и сложнейшего вопроса вылилось не менее, чем в сотню постов. Вношу свой вклад.
:о)
← →
Piter © (2004-07-25 17:15) [20]Mental_Ray © (25.07.04 10:18) [13]
а зачем тебе показывать как windows? Показывай ПРАВИЛЬНО. Делай лучше, чем в windows...
← →
Димон (2004-07-25 21:03) [21]Anatoly Podgoretsky
А почему ты умножаешь на 100, а не 102.
Для сравнения 1.5 это не 1500, а 1024+512
Умножаю на 100 для того, чтобы сдвинуть запятую, перед Trunc. Разве не понятно из Mental_Ray © (25.07.04 11:23) [15] <i/>???
← →
Mental_Ray © (2004-07-25 21:05) [22]Ага...
← →
SergP © (2004-07-25 21:26) [23]
> [18] DiamondShark © (25.07.04 15:39)
> Ух ты, блин! Новая единица измерения: виндовые килобайты
> ;)
Хм. это еще ничего... Нормальные люди знают что 1 кб = 1024 байт. А вот производители винтов почему-то думают что 1 кб = 1000 байт...
Так что оказывается не все думают правильно... Может винда тоже "не совсем правильно думает"?
← →
Anatoly Podgoretsky © (2004-07-25 21:37) [24]Просто у них в метре 98 сантиметров.
Виндоус правильно думает и не пытается умножать на 100
← →
TopT (2004-07-26 00:40) [25]//И я понял почему. Байты, разделенные на (1024*1024) нужно не //округлять а просто показать с двумя цифрами после запятой! И //отсюда вытекает логичный вопрос: какая функция это делает? :)
А зачем вы пареитесь? Вы же перевели Float в string, а уж string обрезать несложно, есть процедура под названием Deleteprocedure Delete(var S: string; Index, Count:Integer);
← →
Мышь (2004-07-26 07:58) [26]Очень удобная функция для округления типа
12378.123312 -> 12378.12
и
12378.123312 -> 12300
называется RoundTo. Учите MathЧасть:)
← →
Labert (2004-07-26 10:12) [27]Действительно тупой вопрос...
← →
Peter (2004-07-26 10:17) [28]Предполагаю, что винда перед всеми вышеуказанными вычислениями округляет байты до трёх или четырёх значащих цифр слева вот так:
8 441 343 -> 8 441 000
А потом делит и получает:
8 441 000 / 1024^2 = 8.0499649
И трункает до двуц цифр после запятой:)
← →
Anatoly Podgoretsky © (2004-07-26 10:36) [29]Labert (26.07.04 10:12) [27]
Ты думаешь тупой?
Нет нормальный, просто от пытается сделать это на основании системы 1000 вместо 1024
← →
Alexander1966 (2004-07-26 15:48) [30]Немножко поумничаю :)
Артемий Лебедев
§ 84. Сколько байтов в килобайте?
http://www.artlebedev.ru/kovodstvo2/sections/84/
← →
Mental_Ray © (2004-07-26 16:34) [31]Вот что у меня получилось:
function FileSize(Fname:string);
begin
with TFileStream.Create(FName, fmOpenRead) do
try
case Size of
0..1023:
Result :=inttostr(Size)+" байт";
1024..1024*10-1:
Result :=floattostr(trunc((Size/1024)*100)/100)+" Кб";
1024*10..1024*100-1:
Result :=floattostr(trunc((Size/1024)*10)/10)+" Кб";
1024*100..1024*1000-1:
Result :=floattostr(trunc(Size/1024))+" Кб";
1024*1000..1024*10000-1:
Result :=floattostr(trunc((Size/1024/1024)*100)/100)+" Мб";
1024*10000..1024*100000-1:
Result :=floattostr(trunc((Size/1024/1024)*10)/10)+" Мб";
1024*100000..1024*1000000-1:
Result :=floattostr(trunc(Size/1024/1024))+" Мб";
end
finally
Free
end
end;
Надеюсь все правильно :))
← →
Игорь Шевченко © (2004-07-26 17:43) [32]Mental_Ray © (25.07.04 10:18)
Windows использует целочисленное деление
← →
Fay © (2004-07-26 17:52) [33]2Mental_Ray © (26.07.04 16:34) [31]
Ужасно.floattostr(trunc(
несколько раз - это ужасно. Способ получения размера вАщЕ зверский.
← →
Esu © (2004-07-26 20:50) [34]Fay © (26.07.04 17:52) [33]
Где ты видишь несколько раз ? Там один раз :)
← →
Fay © (2004-07-26 21:37) [35]..1023:
Result :=inttostr(Size)+" байт";
1024..1024*10-1:
Result :=floattostr(trunc((Size/1024)*100)/100)+" Кб"; // 1
1024*10..1024*100-1:
Result :=floattostr(trunc((Size/1024)*10)/10)+" Кб"; // 2
1024*100..1024*1000-1:
Result :=floattostr(trunc(Size/1024))+" Кб";
1024*1000..1024*10000-1:
Result :=floattostr(trunc((Size/1024/1024)*100)/100)+" Мб"; // 3
1024*10000..1024*100000-1:
Result :=floattostr(trunc((Size/1024/1024)*10)/10)+" Мб"; // 4
1024*100000..1024*1000000-1:
Result :=floattostr(trunc(Size/1024/1024))+" Мб"; // 5
Итого 5. Это как, один или уже не очень?
← →
Fay © (2004-07-26 21:38) [36]Я бы даже сказал 6, но не сказал. 8)
← →
Mental_Ray © (2004-07-27 07:34) [37]
> Fay © (26.07.04 21:38) [36]
> Я бы даже сказал 6, но не сказал. 8)
Ты такой умный, а как ты еще предлагаешь сделать чтобы прога показывала:
если меньше 10 Кб то 5,35
если больше 10 Кб и меньше 100 то 53,5
если больше 100 и меньше 999 Кб то 535
и т.д.
Вместо того, чтобы просто трепаться, лучше бы свой код привел к примеру. А то все говорят, типа тупой вопрос, ну пожалуйста, покажите код, который решает вопрос не тупо!
← →
panov © (2004-07-27 09:17) [38]
type
sofType=(sofB,sofKB,sofMB,sofGB);
function SizeOfFile(const FilePath: String;const sType: sofType=sofB): Integer;
var
Size: Int64;
FS: THandle;
FD: WIN32_FIND_DATA;
begin
Result := -1;
FS := FindFirstFile(PChar(FilePath),FD);
if FS <> INVALID_HANDLE_VALUE then
begin
Size := (FD.nFileSizeHigh shl 32) + FD.nFileSizeLow;
windows.FindClose(FS);
case sType of
sofB: Result := Size; //?
sofKB: Result := Size div 1024; //??
sofMB: Result := Size div (1024*1024); //??
sofGB: Result := Size div (1024*1024*1024); //??
end;
end;
end;
← →
Игорь Шевченко © (2004-07-27 11:36) [39]panov © (27.07.04 09:17)
Ну и как ты 10,5 кБ получишь ?
← →
panov © (2004-07-27 12:02) [40]а, понятно.
т.е. нужно получить значение с некоторым количеством знаков после запятой.
Вот только я не нашел, где посмотреть в Windows такие значения можно.
Везде выдается в б, Кб, Мб, Гб
Страницы: 1 2 вся ветка
Текущий архив: 2004.08.08;
Скачать: CL | DM;
Память: 0.55 MB
Время: 0.031 c