条件未按预期解决

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,但它是 ulongGetDiskFreeSpaceEx返回的值是377,325,965,312超过int的最大值(2,147,483,647)。

因此,ulong 的最少 32 位被用于 down-casted int,在您的情况下,这是一个负数,因为它的最高有效位是 1。因此,条件将是 true.

11011010011000010101000000000000 (-631156736)

相反,将 gameSize 转换为 ulong,这样您就不会丢失信息。

if ((ulong)gameSize > freeBytesAvailable)