Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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 обрезать несложно, есть процедура под названием Delete
procedure 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.57 MB
Время: 0.05 c
11-1078383184
Ricko
2004-03-04 09:53
2004.08.08
Плагины для Round_Watch


14-1090328997
офф ;(
2004-07-20 17:09
2004.08.08
значение слова мизерабль? Ну понятно что- плебей, а поконкретней?


1-1090642122
Кириешки
2004-07-24 08:08
2004.08.08
Помогите решить проблему со скинами.


1-1090786815
Anton Sh
2004-07-26 00:20
2004.08.08
Насчёт пиктограмм


14-1090736827
SergP
2004-07-25 10:27
2004.08.08
PHP. Нужно что-то наподобии дельфийского IntToHex