2011-04-12 63 views
5

可能重复:
Get drive information (free space, etc.) for drives on Windows and populate a memo box德尔福 - 枚举的盘(S)和其他驱动器的Windows PC上

我很新的编程(尤其是德尔福),并一直未能查找有关如何枚举PC上所有驱动器的任何示例。

我真的很在乎硬盘和光驱,但我一直无法找到任何可用的东西。

任何人都可以指向一个良好的工作样本的方向吗?

+0

我真的很抱歉,我在发布之前搜索过,但没有看到其他帖子。我应该删除我的问题吗? – DelphiDelver 2011-04-12 13:45:17

+0

没关系。它*不容易搜索重复。我想你可以在这里留下你的问题(除此之外,我不认为你已经发布了回答,所以你甚至不能删除它)。另外,这种方式在将来会更容易在SO上找到这个话题,因为那时有两个问题略有不同的措辞。 – 2011-04-12 13:49:41

+0

你不应该担心删除它,并且在一个非常自私的纸条上,我很高兴,因为你接受了答案,原来的海报没有。这就是生活。 – Reallyethical 2011-04-12 13:50:21

回答

14

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

这个例子有2个部分。第一是使用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,但你真的应该转换为双精度,并选择你的格式,如果作为MB更精确,因为我上面创建的例子当然会收起来。

希望这是一些小的帮助。

+0

谢谢我现在看看这个,我会给你一个投票,但看起来我对这个网站来说太新了。对不起 – DelphiDelver 2011-04-12 13:04:27

2

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

+0

+1让我发现这个库 – FileVoyager 2013-03-28 09:29:19