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

Вниз

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

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

Наверх





Память: 0.55 MB
Время: 0.043 c
4-1088510108
NLO
2004-06-29 15:55
2004.08.08
Find_Window


1-1090438400
TBeginner
2004-07-21 23:33
2004.08.08
Как узнать имя файла беc расширения


14-1090506373
DSKalugin
2004-07-22 18:26
2004.08.08
платформа .NET Стоит ли переходить?


3-1089889217
Valer
2004-07-15 15:00
2004.08.08
Access, изменение содержимого запроса.


8-1085322240
Yokka-56
2004-05-23 18:24
2004.08.08
Гуру Дульфи, подскажите пожалуйста





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