这个函数是我找了好久,然后在百度和MSDN翻来翻去后,终于写出来的一个函数。百度的函数要求的权限太大,在Windows 7以后用不了。
type STORAGE_DEVICE_NUMBER = record DeviceType: Word; DeviceNumber: Cardinal; PartitionNumber: ULONG; end; /// <summary>获取物理路径对应的磁盘序号</summary> /// <param name="APath">目录名,只支持绝对路径名,如"C:\temp",不能是相对路径</param> /// <returns>返回当前目录对应的磁盘序号,-1代表未找到。</returns> function TForm6.GetPhysicalDriveNo(APath: QStringW): Integer; var hDev: THandle; AResult: Boolean; AReaded: Cardinal; ANumber: STORAGE_DEVICE_NUMBER; begin APath := '\\.\' + Copy(APath, 1, 2); Result := -1; hDev := CreateFileW(PQCharW(APath), FILE_READ_ATTRIBUTES or SYNCHRONIZE or FILE_TRAVERSE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); if hDev <> INVALID_HANDLE_VALUE then begin AResult := DeviceIoControl(hDev, IOCTL_STORAGE_GET_DEVICE_NUMBER, nil, 0, @ANumber, SizeOf(ANumber), AReaded, nil); if AResult then Result := ANumber.DeviceNumber; CloseHandle(hDev); end; end;
运行效果: