gpt4 book ai didi

delphi - 获取有效的盘符并被占用

转载 作者:行者123 更新时间:2023-12-03 15:03:44 25 4
gpt4 key购买 nike

我想扫描我的计算机上存在的所有可用驱动器号,并获取详细信息(如果已占用,请检查,类型和大小请检查)。

我对如何使用下面的代码获取大小没有问题

var
FreeAvail, totalSpace: Int64;
begin
if SysUtils.GetDiskFreeSpaceEx(PChar('F:\'), FreeAvail, totalSpace, nil) = True
then
begin
F1.Liner('Drive F total space ');
F1.pBold(IntToStr(totalSpace div (1024 * 1024 * 1024)) + ' GB ,');
F1.Liner(' available free space ');
F1.pBold(IntToStr(FreeAvail div (1024 * 1024 * 1024)) + ' GB.');
end;
end;

但是如果驱动器未被占用,我不喜欢这种情况。

error message if no media

问题:如何获取可用的所有驱动器 - CDROM、USB 内存棒等。更具体地说,我想要像这个例子一样的显示结果;

驱动器 E [本地磁盘] - TotalSpace 500 GB - FreeSpace 200 GB

驱动器 F [CD 驱动器] - 未占用 - 可用空间 0

驱动器 G [可移动] - TotalSpace 8 GB - FreeSpace 2 GB

最佳答案

我提供了一些可能有帮助的函数。第一个使用Win32 API函数GetLogicalDriveStrings检索计算机上分配的驱动器号的列表。第二个查询驱动器以查看它是否准备好使用(其中有磁盘)。 (还有一个实用程序函数,可以将驱动器号转换为 DiskSize(旧的 Pascal I/O 函数)所需的整数值。)

该代码自 Win95 以来一直有效,并且刚刚在 Win7 64 位的 Delphi 2007 控制台应用程序中进行了测试。下面包含一个控制台测试应用程序。

program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils, Windows, Types;

// Returns an array filled wit the assigned
// drive letters on the current computer.
function GetDriveList: TStringDynArray;
var
Buff: array[0..128] of Char;
ptr: PChar;
Idx: Integer;
begin
if (GetLogicalDriveStrings(Length(Buff), Buff) = 0) then
RaiseLastOSError;
// There can't be more than 26 lettered drives (A..Z).
SetLength(Result, 26);

Idx := 0;
ptr := @Buff;
while StrLen(ptr) > 0 do
begin
Result[Idx] := ptr;
ptr := StrEnd(ptr);
Inc(ptr);
Inc(Idx);
end;
SetLength(Result, Idx);
end;

// Converts a drive letter into the integer drive #
// required by DiskSize().
function DOSDrive( const sDrive: String ): Integer;
begin
if (Length(sDrive) < 1) then
Result := -1
else
Result := (Ord(UpCase(sDrive[1])) - 64);
end;

// Tests the status of a drive to see if it's ready
// to access.
function DriveReady(const sDrive: String): Boolean;
var
ErrMode: Word;
begin
ErrMode := SetErrorMode(0);
SetErrorMode(ErrMode or SEM_FAILCRITICALERRORS);
try
Result := (DiskSize(DOSDrive(sDrive)) > -1);
finally
SetErrorMode(ErrMode);
end;
end;

// Demonstrates using the above functions.
var
DrivesArray: TStringDynArray;
Drive: string;
const
StatusStr = 'Drive %s is ready: %s';
begin
DrivesArray := GetDriveList;
for Drive in DrivesArray do
WriteLn(Format(StatusStr, [Drive, BoolToStr(DriveReady(Drive), True)]));
ReadLn;
end.

在我的系统(Win7 64、两个物理硬盘驱动器(C: 和 D:)、一个未安装镜像的 ISO 设备 (E:) 和一个 DVD 驱动器 (Z:) 上)运行时的示例输出。

Drive C:\ is ready: True 
Drive D:\ is ready: True
Drive E:\ is ready: False
Drive Z:\ is ready: True

关于delphi - 获取有效的盘符并被占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26444113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com