Как правильно преобразовать размер файла в байтах в мегабайты или гигабайты? - PullRequest
21 голосов
/ 19 февраля 2009

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

Ответы [ 7 ]

48 голосов
/ 19 февраля 2009

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

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

Обратите внимание, что только производители дисков используют 1000. В Windows и большинстве программ правильное масштабирование составляет 1024.

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

KB = B >> 10
MB = KB >> 10 = B >> 20
GB = MB >> 10 = KB >> 20 = B >> 30

Хотя для удобства чтения я ожидаю, что последовательное деление на 1024 более понятно.

24 голосов
/ 19 февраля 2009
11 голосов
/ 21 октября 2010

/// <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"
10 голосов
/ 19 февраля 2009

1024 на самом деле не так. Международное инженерное сообщество (МЭК) разработало стандарт в 2000 году, который, к сожалению, игнорируется компьютерной индустрией. Этот стандарт в основном гласит, что

  • 1000 байт - это килобайт, 1000 КБ - один МБ и т. Д. Сокращения: КБ, МБ, ГБ и т. Д.
  • Широко используемые 1024 байта = 1 килобайт должны вместо этого называться 1024 байтами = 1 кибибайт (КиБ), 1024 КиБ = 1 мегабайт (МиБ), 1024 МиБ = 1 гибибайт (ГиБ) и т. Д.

Вы все можете прочитать его в IEC SI зоне .

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

4 голосов
/ 19 февраля 2009

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

1 голос
/ 08 января 2010

Я слабо помню, что ответ о том, использовать ли 1000 или 1024, лежит в префиксе. Пример: Если используется «научное» масштабирование 1000, то «научная» единица измерения будет в кБ (как в кг, кН и т. Д.). Если используется компьютерное масштабирование 1024, то единицей будет КБ. Таким образом, верхний регистр научного префикса делает его ориентированным на компьютер.

0 голосов
/ 19 февраля 2009

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

...