c# - 条件未按预期解决
问题描述
我正在使用这个库来获取可用磁盘空间的数量:
[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
. is返回的值GetDiskFreeSpaceEx
超过了( )377,325,965,312
的最大值。int
2,147,483,647
因此,至少 32 位ulong
用于向下转换int
,在您的情况下为负数,因为它的最高有效位是1
. 因此,条件将是true
。
11011010011000010101000000000000 (-631156736)
相反,将gameSize
to 转换为ulong
,这样您就不会丢失信息。
if ((ulong)gameSize > freeBytesAvailable)
推荐阅读
- regex - Delphi正则表达式中INSIDE LOOKBEHIND内的变量重复?
- uuid - 在 JMeter 中生成长度为 35 个字符的 UUID
- javascript - ESLint yoda 忽略未定义的比较,如 foo === undefined
- javascript - Javascript Canvas 触摸事件
- python - Python SMTPAuthnticationError
- php - 如何在 Google 图表中回显?
- r - 如何在 R 中绘制标准正态 CDF?
- macros - 数据透视表的 MACRO 调试
- java - 不使用 Java 数学类的数学运算
- android - Android Flavor 特定依赖树