[Back to DELPHI SWAG index]  [Back to Main SWAG index]  [Original]


3.01 How does one retrieve the volume and the serial number of a harddisk
or floppy with Delphi?


The following source code was provided to DELPHI-L by Paul Sobolik
<psobolik@aol.com>


---
unit VolInfo;

interface

uses Windows;

type
  TFSFlag = (FSCaseIsPreserved, FSCaseSensitive, FSUnicodeStoredOnDisk,
      FSPersistentACLS, FSVolIsCompressed, FSFileCompression);
  TFSFlags = set of TFSFlag;
  TVolumeInfo = record
    VolumeName: String;
    VolumeSN: DWord;
    MaxComponent: DWord;
    FSFlags: TFSFlags;
    FSName: String;
  end;

function GetVolumeInfo(rootPath: String; var vi: TVolumeInfo): Boolean;

implementation
{
function GetVolumeInformation(
  lpRootPathName: PChar;
  lpVolumeNameBuffer: PChar;
  nVolumeNameSize: DWORD;
  lpVolumeSerialNumber: PDWORD;
  var lpMaximumComponentLength,
  lpFileSystemFlags: DWORD;
  lpFileSystemNameBuffer: PChar;
  nFileSystemNameSize: DWORD): BOOL; stdcall;
}
function GetVolumeInfo(rootPath: String; var vi: TVolumeInfo): Boolean;
type
  TCharBuffer = array[0..255] of Char;
var
  flags, sn, mc: DWord;
  bufVolumeName, bufFSName: TCharBuffer;
begin
  with vi do begin
    result := GetVolumeInformation(PChar(rootPath),
        @bufVolumeName, sizeof(bufVolumeName),
        @sn, mc, flags,
        @bufFSName, sizeof(bufFSName));
    FSFlags := [];
    if result then begin
      VolumeName := bufVolumeName;
      VolumeSN := sn;
      MaxComponent := mc;
      FSName := bufFSName;
      if flags and FS_CASE_IS_PRESERVED <> 0 then FSFlags := FSFlags +
[FSCaseIsPreserved];
      if flags and FS_CASE_SENSITIVE <> 0  then FSFlags := FSFlags +
[FSCaseSensitive];
      if flags and FS_UNICODE_STORED_ON_DISK <> 0  then FSFlags := FSFlags
+
[FSUnicodeStoredOnDisk];
      if flags and FS_PERSISTENT_ACLS <> 0  then FSFlags := FSFlags +
[FSPersistentACLS];
      if flags and FS_VOL_IS_COMPRESSED <> 0  then FSFlags := FSFlags +
[FSVolIsCompressed];
      if flags and FS_FILE_COMPRESSION <> 0 then FSFlags := FSFlags +
[FSFileCompression];
    end else begin
      VolumeName := '';
      VolumeSN := 0;
      MaxComponent := 0;
      FSName := '';
    end;
  end;
end;

end.

[Back to DELPHI SWAG index]  [Back to Main SWAG index]  [Original]