Delphi - 在Windows PC上枚举磁盘和其他驱动器

时间:2011-04-12 13:00:03

标签: delphi winapi

  

可能重复:
  Get drive information (free space, etc.) for drives on Windows and populate a memo box

我是编程(特别是Delphi)的新手,并且无法找到有关如何枚举PC上所有驱动器的任何示例。

我真的关心硬盘和CD-ROM驱动器,但我找不到任何可用的东西。

有人能指出我的工作样本方向吗?

2 个答案:

答案 0 :(得分:15)

最简单的方法是使用GetDiskFreeSpaceEx文件中的sysutils.pas

此示例共有两个部分。第一个是使用GetDiskFreeSpaceEX的重要部分。

function DriveSpace(DriveLetter : String; var FreeSpace, UsedSpace, TotalSpace : int64) : Boolean;
begin
  Result := SysUtils.GetDiskFreeSpaceEx(Pchar(DriveLetter), UsedSpace, TotalSpace, @FreeSpace);

  if UsedSpace > 0 then
    UsedSpace := TotalSpace - FreeSpace;

  if not Result then
  begin
    UsedSpace   := 0;
    TotalSpace  := 0;
    FreeSpace   := 0;
  end;
end;

如果您要请求已经知道驱动器号的驱动器,例如C:那么这就是您所需要的。

用法如下:

var
  FS,
  US,
  TS : Int64
begin
  DriveSpace('C:', FS, US, TS);
  //Do something with the 3 variables.
end;

话虽如此,如果你想找到驱动器,你可以使用这样的东西:

procedure ListDrivesOfType(DriveType : Integer; var Drives : TStringList);
var
  DriveMap,
  dMask : DWORD;
  dRoot : String;
  I     : Integer;
begin
  dRoot     := 'A:\'; //' // work around highlighting
  DriveMap  := GetLogicalDrives;
  dMask     := 1;

  for I := 0 to 32 do
  begin
    if (dMask and DriveMap) <> 0 then
      if GetDriveType(PChar(dRoot)) = DriveType then
      begin
        Drives.Add(dRoot[1] + ':');
      end;

    dMask := dMask shl 1;
    Inc(dRoot[1]);
  end;
end;

注意DriveType整数应该是以下之一:

DRIVE_UNKNOWN     = 0;
DRIVE_NO_ROOT_DIR = 1;
DRIVE_REMOVABLE   = 2;
DRIVE_FIXED       = 3;
DRIVE_REMOTE      = 4;
DRIVE_CDROM       = 5;
DRIVE_RAMDISK     = 6;

(我已经直接从windows.pas


现在最后回答你的问题(这非常粗糙)以下内容会将信息添加到所有FIXED HARD DRIVES的备忘录(称为memo1)中:

Procedure TAform.SomeNameICantThinkOfNow;
const
  BytesPerMB = 1048576;
var
  MyDrives   : TStringlist;
  I : Integer;
  FreeSpace,
  UsedSpace,
  TotalSpace : int64;
begin
  MyDrives := TStringlist.Create;
  ListDrivesOfType(DRIVE_FIXED, MyDrives);

  Memo1.Lines.Clear;

  for I := 0 to MyDrives.Count - 1 do
  begin
    FreeSpace  := 0;
    UsedSpace  := 0;
    TotalSpace := 0;

    if DriveSpace(MyDrives.Strings[I], FreeSpace, UsedSpace, TotalSpace) then
    begin
      FreeSpace  := FreeSpace  div BytesPerMB;
      UsedSpace  := UsedSpace  div BytesPerMB;
      TotalSpace := TotalSpace div BytesPerMB;

      Memo1.Lines.Add('Drive: ' + MyDrives.Strings[I] + ' = Free Space :' + IntToStr(FreeSpace) +
                      ' Used Space: ' + IntToStr(UsedSpace) + ' Total Space: ' + IntToStr(TotalSpace));
    end;
  end;
end;

我确实说过这会很糟糕!我刚刚在IDE中运行它并且它可以工作,我已经完成了MB,但实际上你应该转换为Double并选择你的格式化,如果做MB更精确,因为我上面创建的例子当然会围绕

希望这是一些小帮助。

答案 1 :(得分:2)

GLibWMI Library;使用它,您可以访问有关系统驱动器的信息。