Как правильно преобразовать размер файла в байтах в мегабайты или гигабайты?
Я использую класс DriveInfo в своем проекте C# для извлечения доступных байтов на заданных дисках. Как правильно конвертировать это число в мегабайты или гигабайты? Я думаю, что деление на 1024 не поможет. Результаты всегда отличаются от тех, что показаны в Windows-Explorer.
8 ответов
1024 правильно для использования в программах.
Причина, по которой у вас могут быть различия, скорее всего, связана с различиями в том, что driveinfo сообщает как "доступное пространство" и в том, что окна считают доступным пространством.
Обратите внимание, что только производители дисков используют 1000. В Windows и большинстве программ правильное масштабирование составляет 1024.
Кроме того, в то время как ваш компилятор должен оптимизировать это в любом случае, этот расчет можно сделать, просто сдвинув биты на 10 для каждой величины:
KB = B >> 10
MB = KB >> 10 = B >> 20
GB = MB >> 10 = KB >> 20 = B >> 30
Хотя для удобства чтения я ожидаю, что последовательное деление на 1024 будет более понятным.
/// <summary>
/// Function to convert the given bytes to either Kilobyte, Megabyte, or Gigabyte
/// </summary>
/// <param name="bytes">Double -> Total bytes to be converted</param>
/// <param name="type">String -> Type of conversion to perform</param>
/// <returns>Int32 -> Converted bytes</returns>
/// <remarks></remarks>
public static double ConvertSize(double bytes, string type)
{
try
{
const int CONVERSION_VALUE = 1024;
//determine what conversion they want
switch (type)
{
case "BY":
//convert to bytes (default)
return bytes;
break;
case "KB":
//convert to kilobytes
return (bytes / CONVERSION_VALUE);
break;
case "MB":
//convert to megabytes
return (bytes / CalculateSquare(CONVERSION_VALUE));
break;
case "GB":
//convert to gigabytes
return (bytes / CalculateCube(CONVERSION_VALUE));
break;
default:
//default
return bytes;
break;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return 0;
}
}
/// <summary>
/// Function to calculate the square of the provided number
/// </summary>
/// <param name="number">Int32 -> Number to be squared</param>
/// <returns>Double -> THe provided number squared</returns>
/// <remarks></remarks>
public static double CalculateSquare(Int32 number)
{
return Math.Pow(number, 2);
}
/// <summary>
/// Function to calculate the cube of the provided number
/// </summary>
/// <param name="number">Int32 -> Number to be cubed</param>
/// <returns>Double -> THe provided number cubed</returns>
/// <remarks></remarks>
public static double CalculateCube(Int32 number)
{
return Math.Pow(number, 3);
}
//Sample Useage
String Size = "File is " + ConvertSize(250222,"MB") + " Megabytes in size"
1024 на самом деле не так. Международное инженерное сообщество (МЭК) разработало стандарт в 2000 году, который, к сожалению, игнорируется компьютерной индустрией. Этот стандарт в основном говорит, что
- 1000 байт - это килобайт, 1000 КБ - один МБ и т. Д. Сокращения: КБ, МБ, ГБ и т. Д.
- Широко используемые 1024 байта = 1 килобайт должны вместо этого называться 1024 байтами = 1 кибибайт (КиБ), 1024 КиБ = 1 мегабайт (МиБ), 1024 МиБ = 1 гибибайт (ГиБ) и так далее.
Вы все можете прочитать это в зоне IEC SI.
Поэтому, чтобы ваши преобразования были правильными и правильными в соответствии с международной стандартизацией, вы должны использовать эту научную запись.
Это зависит от того, хотите ли вы указать фактический размер файла или размер на диске. Фактический размер файла - это фактическое количество байтов, которое файл использует в памяти. Размер на диске зависит от размера файла и размера блока для вашей дисковой / файловой системы.
У меня есть слабое воспоминание, что ответ о том, использовать ли 1000 или 1024, лежит в префиксе. Пример: если используется "научное" масштабирование 1000, то "научным" будет значение в килобайтах (как в килограммах, кН и т. Д.). Если используется компьютерное масштабирование 1024, то единицей будет КБ. Таким образом, верхний регистр научного префикса делает его ориентированным на компьютер.
Вот простой пример кода на С++, который я подготовил, который может быть полезен. Вам нужно указать размер ввода в байтах, и функция вернет удобочитаемый размер:
std::string get_human_readable_size(long bytes)
{
long gb = 1024 * 1024 * 1024;
long mb = 1024 * 1024;
long kb = 1024;
if( bytes >= gb) return std::to_string( (float)bytes/gb ) + " GB ";
if( bytes >= mb) return std::to_string( (float)bytes/mb ) + " MB ";
if( bytes >= kb) return std::to_string( (float)bytes/gb ) + " KB ";
return std::to_string(bytes) + " B ";
}