お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"リムーバブルディスク関数"





今週末は、プロッピー三昧でした。
みなさまにもお裾分けを。
ほとんどFDELPHIの過去ログにあった物を
アレンジしただけですが。

type
  TRemovableDiskState = (
    reOK,
    reProtect,
    reUnInserting,
    reUnFormatting,
    reNotRemovable,
    reUnknownError
  );

function RemovableState(const ADrive: Char): TRemovableDiskState;
function FloppyState: TRemovableDiskState;
procedure DeleteFloppy;
procedure DeleteFiles(const Dir: string); overload;
procedure DeleteFiles(const Dir, FindStr: string); overload;
function IsRemovable(const ADrive: Char): Boolean;
function IsFDDrive(const ADrive: Char): Boolean;
function FDDriveStr: string;
function FDDriveIndex: Byte;

implementation

uses ShellAPI, FileCtrl;//他にも必要かも?

function RemovableState(const ADrive: Char): TRemovableDiskState;
var
  rc, er: HFILE;
  sa: TSecurityAttributes;
  dummy: string;
  defMode: UINT;
begin
  if not IsRemovable(ADrive) then
  begin
    Result := reNotRemovable;
    Exit;
  end;

  repeat
    dummy := Format(ADrive + ':\%.3f', [Time * 100000000]);
  until not FileExists(dummy);

  rc := 0;
  defMode := SetErrorMode(SEM_FAILCRITICALERRORS);
  try
    sa.nLength := SizeOf(TSecurityAttributes);
    sa.lpSecurityDescriptor := nil;
    sa.bInheritHandle := True;
    rc := CreateFile(PChar(dummy), GENERIC_WRITE, 0, @sa,
      CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    er := GetLastError;
    if er <> 0 then
    begin
      case er of
        19  : Result := reProtect;
        21  : Result := reUnInserting;
        1005: Result := reUnFormatting;
      else
        Result := reUnknownError;
      end;
    end
    else
      Result := reOK;
  finally
    if rc <> 0 then
      CloseHandle(rc);
    DeleteFile(dummy);
    SetErrorMode(defMode);
  end;
end;

function FloppyState: TRemovableDiskState;
var
  b: Byte;
begin
  b := FDDriveIndex;
  if b = 0 then
    Result := reUnknownError
  else
    Result := RemovableState(Char(Ord('A') + b - 1));
end;

procedure DeleteFloppy;
var
  d: string;
begin
  d := FDDriveStr;
  if d = '' then
    raise Exception.Create('フロッピードライブが見つかりません。');
  DeleteFiles(d);
end;

procedure DeleteFiles(const Dir: string);
begin
  DeleteFiles(Dir, '*');
end;

procedure DeleteFiles(const Dir, FindStr: string);
  procedure Del(const Dir: string);
  var
    sr: TSearchRec;
    d,f: string;
  begin
    d := IncludeTrailingBackslash(Dir);

    if FindFirst(d + FindStr, faAnyFile, sr) = 0 then
      try
        repeat
          f := d + sr.Name;
          if (sr.Attr and faReadOnly) > 0 then
            FileSetAttr(f, sr.Attr - faReadOnly);
          if (sr.Attr and faDirectory) > 0 then
          begin
            if (sr.Name <> '.') and (sr.Name <> '..') then
            begin
              Del(f);
              RemoveDir(f);
            end;
          end
          else
            Deletefile(f);
        until FindNext(sr) <> 0;
      finally
        FindClose(sr);
      end;
  end;
begin
  Del(Dir);
end;

function IsFDDrive(const ADrive: Char): Boolean;
var
  d: string;
  fi: TSHFileInfo;
begin
  d := ADrive + ':\';
  Result := (GetDriveType(PChar(d)) = DRIVE_REMOVABLE)
    and (SHGetFileInfo(PChar(d), 0, fi, SizeOf(fi), SHGFI_DISPLAYNAME) <> 0)
    and (Pos(' FD (', UpperCase(fi.szDisplayName)) > 0);
end;

function IsRemovable(const ADrive: Char): Boolean;
begin
  Result := GetDriveType(PChar(ADrive + ':\')) = DRIVE_REMOVABLE;
end;

function FDDriveIndex: Byte;
var
  x: DWORD;
  i: Integer;
begin
  Result := 0;
  x := GetLogicalDrives;
  for i := 0 to Ord('Z') - Ord('A') do
    if LongBool(x and ($0001 shl i)) then
      if IsFDDrive(Char(Ord('A') + i)) then
      begin
        Result := i + 1;
        Exit;
      end;
end;

function FDDriveStr: string;
var
  b: Byte;
begin
  b := FDDriveIndex;
  if b > 0 then
    Result := Char(Ord('A') + b - 1) + ':\'
  else
    Result := '';
end;

                                     02/04/21(日)  かつぼー(CQU00157)
 


- FDELPHI  MES(16):玉石混淆みんなで作るSample蔵【見本蓄積】 02/04/23 -

Original document by かつぼー        氏 ID:(CQU00157)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum