Как правильно преобразовать размер файла в байтах в мегабайты или гигабайты?

Я использую класс 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 ";
}

Разделите на 1024.

Другие вопросы по тегам