我对以下代码有一些疑问。
from win32 import win32file
drives = []
drivebits=win32file.GetLogicalDrives()
for d in range(1,26):
mask=1 << d
if drivebits & mask:
drname='%c:\\' % chr(ord('A')+d)
t=win32file.GetDriveType(drname)
if t == win32file.DRIVE_REMOVABLE:
drives.append(drname)
print(drives)
1 - 当您使用win32模块中的GetLogicalDrives时,它返回一个整数。有人解释原因吗?
2 - 为什么循环范围在1到26之间?
3 - 按位AND的原因是什么?
谢谢
答案 0 :(得分:1)
win32
模块是Win32 API的一个非常低级的包装器,因此通常您可以查看函数名称的Windows文档并获取所需的信息。您可以找到documentation for GetLogicalDrives here.
回答你的问题:
整数对应于可用的驱动器:每个可用的驱动器获得1位。因此,如果没有可用的驱动器,则返回假定为32位整数的0
。如果每个驱动器都可用,您将获得0b11111111111111111111111111
(二进制)
有26个字母,所以循环显示26个数字。 实际上,您发布的代码仅从1到25循环,我认为这是一个错误。它应该是range(26)
。
按位并且是检查返回的整数的各个位。请记住,整数的每个位对应一个驱动器号。例如,假设您的C,D和G驱动器可用。您可以像这样可视化返回的值,其中第一行是 potential 驱动器,第二行是返回的二进制值:
ZYXWVUTSRQPONMLKJIHGFEDCBA # drive the bit corresponds to
00000000000000000001001100 # returned value, in binary, if C, D, and G are available
要检查驱动器A是否可用,您需要检查最小位是否为1. 检查各个位的方法是按位和。要检查最小位,你会做drivebits & 1
,检查驱动器B,你需要检查第二位:drievebits & (1 << 1)
。要检查C,您需要第三位:drivebits & (1 << 2)
。等等。
一些示例返回:
如果您只有驱动器C可用,GetLogicalDrives
将返回0b100
(二进制)或4
(十进制)。如果C和D可用,您将获得0b1100
(二进制)或12
(十进制)。