条件未按预期解决
Condition is not resolved as expected
我正在使用这个库来获取可用磁盘的数量space:
[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);
那么条件来了:
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;
}
调试记录如下:
为什么条件通过了?
问题是您将 freeBytesAvailable
转换为 int
,但它是 ulong
。 GetDiskFreeSpaceEx
返回的值是377,325,965,312
超过int
的最大值(2,147,483,647
)。
因此,ulong
的最少 32 位被用于 down-casted int
,在您的情况下,这是一个负数,因为它的最高有效位是 1
。因此,条件将是 true
.
11011010011000010101000000000000 (-631156736)
相反,将 gameSize
转换为 ulong
,这样您就不会丢失信息。
if ((ulong)gameSize > freeBytesAvailable)
我正在使用这个库来获取可用磁盘的数量space:
[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);
那么条件来了:
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;
}
调试记录如下:
为什么条件通过了?
问题是您将 freeBytesAvailable
转换为 int
,但它是 ulong
。 GetDiskFreeSpaceEx
返回的值是377,325,965,312
超过int
的最大值(2,147,483,647
)。
因此,ulong
的最少 32 位被用于 down-casted int
,在您的情况下,这是一个负数,因为它的最高有效位是 1
。因此,条件将是 true
.
11011010011000010101000000000000 (-631156736)
相反,将 gameSize
转换为 ulong
,这样您就不会丢失信息。
if ((ulong)gameSize > freeBytesAvailable)