可能重复:
Get drive information (free space, etc.) for drives on Windows and populate a memo box德尔福 - 枚举的盘(S)和其他驱动器的Windows PC上
我很新的编程(尤其是德尔福),并一直未能查找有关如何枚举PC上所有驱动器的任何示例。
我真的很在乎硬盘和光驱,但我一直无法找到任何可用的东西。
任何人都可以指向一个良好的工作样本的方向吗?
可能重复:
Get drive information (free space, etc.) for drives on Windows and populate a memo box德尔福 - 枚举的盘(S)和其他驱动器的Windows PC上
我很新的编程(尤其是德尔福),并一直未能查找有关如何枚举PC上所有驱动器的任何示例。
我真的很在乎硬盘和光驱,但我一直无法找到任何可用的东西。
任何人都可以指向一个良好的工作样本的方向吗?
最简单的方法实际上是使用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更精确,因为我上面创建的例子当然会收起来。
希望这是一些小的帮助。
谢谢我现在看看这个,我会给你一个投票,但看起来我对这个网站来说太新了。对不起 – DelphiDelver 2011-04-12 13:04:27
我真的很抱歉,我在发布之前搜索过,但没有看到其他帖子。我应该删除我的问题吗? – DelphiDelver 2011-04-12 13:45:17
没关系。它*不容易搜索重复。我想你可以在这里留下你的问题(除此之外,我不认为你已经发布了回答,所以你甚至不能删除它)。另外,这种方式在将来会更容易在SO上找到这个话题,因为那时有两个问题略有不同的措辞。 – 2011-04-12 13:49:41
你不应该担心删除它,并且在一个非常自私的纸条上,我很高兴,因为你接受了答案,原来的海报没有。这就是生活。 – Reallyethical 2011-04-12 13:50:21