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

Я использую класс DriveInfo в моем проекте C# для извлечения доступных байтов на заданных дисках. Как правильно преобразовать это число в Мега-или гигабайты? Деление на 1024 не сделает работу, я думаю. Результаты всегда отличаются от результатов, показанных в Проводнике Windows.

7 ответов


1024 правильно для использования в программах.

причина, по которой у вас могут быть различия, вероятно, связана с различиями в том, что driveinfo сообщает как "доступное пространство" и что windows считает доступным пространством.

обратите внимание, что только производители дисков используют 1,000. В windows и большинстве программ правильное масштабирование-1024.

кроме того, хотя ваш компилятор должен оптимизировать это в любом случае, этот расчет можно сделать, просто сдвинув биты на 10 для каждого величина:

KB = B > > 10
MB = KB > > 10 = B > > 20
ГБ = МБ > > 10 = КБ > > 20 = Б > > 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 zone.

поэтому, чтобы ваши преобразования были правильными и правильными в соответствии с международной стандартизацией, вы должны использовать эту научную нотацию.


Это зависит от того, хотите ли вы фактический размер файла или размер на диске. Фактический размер файла-это фактическое количество байтов, которые файл использует в памяти. Размер на диске-это функция размера файла и размера блока для вашего диска/файловой системы.


У меня есть слабое воспоминание, что ответ о том, чтобы использовать 1000 или 1024 лежит в корпусе приставки. Образец: Если используется масштабирование" scientific "1000, то" научная " единица будет kB (так же, как в kg, kN и т. д.). Если используется компьютерное масштабирование 1024, то блок будет КБ. Так, uppercasing научный префикс делает его компьютерной модели.


разделить на 1024.