Состояние не разрешено, как ожидалось - PullRequest
0 голосов
/ 07 августа 2020

Я использую эту библиотеку, чтобы получить количество свободного места на диске:

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetDiskFreeSpaceEx(string lpDirectoryName, out ulong lpFreeBytesAvailable, out ulong lpTotalNumberOfBytes, out ulong lpTotalNumberOfFreeBytes);

Я использую его в методе как:

var result = GetDiskFreeSpaceEx(desiredInstallLocation, out var freeBytesAvailable, out var totalNumberOfBytes, out var totalNumberOfFreeBytes);

Затем условие переходит в play:

if (gameSize > (int)freeBytesAvailable)
{
    MessageBox.Show($"There is not enough disk space!\nYou need to free at least {ConvertBytesToMegabytes(gameSize - (int)freeBytesAvailable)} MB.", "Not enough space on a disk", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
    return false;
}

Вот запись из отладки:

enter image description here

введите описание изображения здесь

Почему условие прошло?

1 Ответ

1 голос
/ 07 августа 2020

Проблема в том, что вы приводите freeBytesAvailable к int, но это ulong. Значение, возвращаемое функцией GetDiskFreeSpaceEx, равно 377,325,965,312, превышает максимальное значение int (2,147,483,647).

Следовательно, наименьшие 32-битные значения ulong принимаются для пониженного преобразования. int, а в вашем случае это отрицательное число, потому что его самый старший бит - 1. Следовательно, условие будет true.

11011010011000010101000000000000 (-631156736)

Вместо этого преобразуйте gameSize в ulong, чтобы не потерять информацию.

if ((ulong)gameSize > freeBytesAvailable)
...