![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Тупой вопрос: как перевести байты в Кб, Мб? :)
Mental_Ray © (2004-07-24 19:49:00)Люди подскажите, на сколько нужно разделить кол-во байт, и с помощью какой функции можно округлить до сотых. :)
Игорь Шевченко (2004-07-27 17:31:00) [1]
> по крайней мере - в московских компьютерных журналах
Те, кто писал Windows, вряд ли их читали :)
Stager (2004-07-27 17:09:00) [2]Ну так а я о чем?
Маленькая буква "б" или "b" - биты. Большая - байты. Насколько я знаю, это достаточно общепринятый стандарт, по крайней мере - в московских компьютерных журналах.
faost (2004-07-27 16:30:00) [3]
> Stager (27.07.04 16:17) [50]
> А можно и я немного поумничаю?
>
> Кб = килобиты
> Мб = мегабиты
> КБ = килоБАЙТЫ
> МБ = мегаБАЙТЫ
Я тебе сотни варинатов могу привести, где Кб (Kb) - это килобиты имеются ввиду, а не килобайты ))
Stager (2004-07-27 16:17:00) [4]А можно и я немного поумничаю?
Кб = килобиты
Мб = мегабиты
КБ = килоБАЙТЫ
МБ = мегаБАЙТЫ
panov (2004-07-27 14:20:00) [5]by Игорь Шевченко:
http://www.scalabium.com/faq/dct0165.htm
А вот из MSDN:
StrFormatByteSizeW Function
--------------------------------------------------------------------------------
Converts a numeric value into a string that represents the number expressed as a size value in bytes, kilobytes, megabytes, or gigabytes, depending on the size.
Syntax
LPTSTR StrFormatByteSizeW( LONGLONG qdw,
LPWSTR pwszBuf,
UINT cchBuf
);
Parameters
qdw
[in] Numeric value to be converted.
pwszBuf
[out] Pointer to the converted string.
cchBuf
[in] Size of pwszBuf, in characters.
Return Value
Returns the address of the converted string, or NULL if the conversion fails.
Remarks
The first parameter of this function has a different type for the ANSI and Unicode versions. If your numeric value is a DWORD, you can use StrFormatByteSize with text macros for both cases. The compiler will cast the numerical value to a LONGLONG for the Unicode case. If your numerical value is a LONGLONG, you should use StrFormatByteSizeW explicitly.
Example
532 -> 532 bytes
1340 -> 1.3KB
23506 -> 23.5KB
2400016 -> 2.4MB
2400000000 -> 2.4GB
Function Information
Minimum DLL Version shlwapi.dll version 4.71 or later
Custom Implementation No
Header shlwapi.h
Import library shlwapi.lib
Minimum operating systems Windows 2000, Windows NT 4.0 with Internet Explorer 4.0, Windows 98, Windows 95 with Internet Explorer 4.0
Anatoly Podgoretsky (2004-07-27 13:55:00) [6]округлить до сотыхи размер не сходится с Виндовским, Виндоус не округляет до сотых. О чем постоянно и говорят здесь.
Anatoly Podgoretsky (2004-07-27 13:53:00) [7]Чтобы не ломали голову, перейдите к понятию проценты
1024=100%
panov (2004-07-27 13:41:00) [8]>Игорь Шевченко © (27.07.04 13:40) [45]
У меня показывает и с двумя, и с одним знаком - для разных файлов.
Игорь Шевченко (2004-07-27 13:40:00) [9]
> Мне интересно, как Windows определяет, сколько знаков после
> запятой показать в каждом случае.
А какие случаи бывают ? У меня с одним знаком показывает.
Дело в том, что Windows не округляет значение, а отбрасывает незначащие цифры.
panov (2004-07-27 13:33:00) [10]>Игорь Шевченко © (27.07.04 13:20) [43]
Мне интересно, как Windows определяет, сколько знаков после запятой показать в каждом случае.
Игорь Шевченко (2004-07-27 13:20:00) [11]
> Провери на нескольких файлах, вроде бы правильно показывает.
Есть файл размером 15251 байт. Windows показывает 14,8 кб, твой код 14,9
Еще раз: в Windows не используются операции с плавающей точкой для определения размеров файлов.
panov (2004-07-27 12:56:00) [12]
type
sofType=(sofB,sofKB,sofMB,sofGB);
function SizeOfFile(const FilePath: String;const sType: sofType=sofB): Double;
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 / 1024; //Кб
sofMB: Result := Size / (1024*1024); //Мб
sofGB: Result := Size / (1024*1024*1024); //Гб
end;
end;
end;
Получение результата:
FormatFloat('0.00',SizeOfFile('c:\AVG6DB_F.DAT',sofMB))
Провери на нескольких файлах, вроде бы правильно показывает.
Игорь Шевченко (2004-07-27 12:43:00) [13]panov © (27.07.04 12:02)
> Вот только я не нашел, где посмотреть в Windows такие значения
> можно.
В проводнике, правой кнопкой
panov (2004-07-27 12:02:00) [14]а, понятно.
т.е. нужно получить значение с некоторым количеством знаков после запятой.
Вот только я не нашел, где посмотреть в Windows такие значения можно.
Везде выдается в б, Кб, Мб, Гб
Игорь Шевченко (2004-07-27 11:36:00) [15]panov © (27.07.04 09:17)
Ну и как ты 10,5 кБ получишь ?
panov (2004-07-27 09:17:00) [16]
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;
Mental_Ray (2004-07-27 07:34:00) [17]
> Fay © (26.07.04 21:38) [36]
> Я бы даже сказал 6, но не сказал. 8)
Ты такой умный, а как ты еще предлагаешь сделать чтобы прога показывала:
если меньше 10 Кб то 5,35
если больше 10 Кб и меньше 100 то 53,5
если больше 100 и меньше 999 Кб то 535
и т.д.
Вместо того, чтобы просто трепаться, лучше бы свой код привел к примеру. А то все говорят, типа тупой вопрос, ну пожалуйста, покажите код, который решает вопрос не тупо!
Fay (2004-07-26 21:38:00) [18]Я бы даже сказал 6, но не сказал. 8)
Fay (2004-07-26 21:37:00) [19]..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. Это как, один или уже не очень?
Esu (2004-07-26 20:50:00) [20]Fay © (26.07.04 17:52) [33]
Где ты видишь несколько раз ? Там один раз :)