ホーム >プログラム >Delphi 6 ローテクTips

Unicode対応FileGetAttr

Unicode対応のFileGetAttr関数。

interface
function FileGetAttrW(const sFile: WideString): Integer;
function gfniFileAttrGet(sFile: WideString; bFileOnly: Boolean): Integer; overload;

const
  FILE_ATTRIBUTE_ENCRYPTED     = $00000040;
  FILE_ATTRIBUTE_SPARSE_FILE   = $00000200;
  FILE_ATTRIBUTE_REPARSE_POINT = $00000400;


implementation
uses
  Windows;


function FileGetAttrW(const sFile: WideString): Integer;
//sFileのファイル属性を返す。
begin
  Result := Integer(GetFileAttributesW(PWideChar(sFile)));
end;

function gfniFileAttrGet(sFile: WideString; bFileOnly: Boolean): Integer; overload;
{
sFileのファイル属性を返す。
ドライブ名のみは無効(-1を返す)。
bFileOnlyがTrueならディレクトリは無視。
}
var
  lh_Handle: THandle;
  lr_Info:   TWin32FindDataW;
  li_Len:    Integer;
begin
  Result := -1;

  //末尾が'\'だとエラーになるので削除
  if (sFile <> '') then begin
    li_Len := Length(sFile);
    if (sFile[li_Len] = '\') then begin
      SetLength(sFile, li_Len -1);
    end;
  end;

  FillChar(lr_Info, SizeOf(TWin32FindDataW), 0);
  lh_Handle:= FindFirstFileW(PWideChar(sFile), lr_Info);
  try
    if (lh_Handle<> INVALID_HANDLE_VALUE) then begin
      repeat
        if  (WideString(lr_Info.cFileName) <> '.')
        and (WideString(lr_Info.cFileName) <> '..')
        then begin
          if (bFileOnly = False)
          or ((bFileOnly) and ((lr_Info.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0))
          then begin
            //bFileOnlyがFalse(ディレクトリも候補に含む)
            //または bFileOnlyがTrueでかつディレクトリではななかった
            Result := Integer(lr_Info.dwFileAttributes);
            Break;
          end;
        end;
      until not(FindNextFileW(lh_Handle, lr_Info));
    end;
  finally
    Windows.FindClose(lh_Handle);
  end;
end;

function gfniFileAttrGet(sFile: WideString): Integer; overload;
begin
  Result := gfniFileAttrGet(sFile, False);
end;

FileGetAttrWはsFileにドライブ名のみを与えた場合、$36 が返ったり $10 が返ったりします
私の環境では 'C:' や 'C:\' 'G:' 'G:\' は$36、 'D:' は $16 'D:\' だと $10 が返ってきます。
存在しないドライブの場合は -1 が返ります。
USBメモリーは $10 が返ってきます。
CD-ROMドライブは $11 が返ってきました。
多分なんらかの法則性はあるのでしょうが、良く分かりません。

gfniFileAttrGetはsFileにドライブ名のみを与えた場合は -1 が返ります。


戻り値は以下の組み合わせ。
エラーの場合は-1。

faReadOnly
FILE_ATTRIBUTE_READONLY
$00000001 読み出し専用ファイル。
faHidden
FILE_ATTRIBUTE_HIDDEN
$00000002 非表示ファイル。
faSysFile
FILE_ATTRIBUTE_SYSTEM
$00000004 システムファイル。
faVolumeID $00000008 ボリュームファイル。
faDirectory
FILE_ATTRIBUTE_DIRECTORY
$00000010 ディレクトリ。
faArchive
FILE_ATTRIBUTE_ARCHIVE
$00000020 アーカイブファイル。
バックアップまたは削除のためにファイルをマークするのに使います。
faAnyFile $0000003F すべてのファイル。
FILE_ATTRIBUTE_ENCRYPTED $00000040 暗号化されています。
ファイルの場合はファイルそのものが暗号化されています。
ディレクトリの場合は今後そこに格納されるファイルが暗号化されることを示します。
FILE_ATTRIBUTE_NORMAL $00000080 ファイルには、 これ以外のほかの属性はありません。
この属性は、 単独で指定したときだけ有効です。
FILE_ATTRIBUTE_TEMPORARY $00000100 ファイルは一時的な記憶域として使用されています。
アプリケーションはファイルへの書き込みができますが、 どうしても必要なときだけに限られます。
FILE_ATTRIBUTE_SPARSE_FILE $00000200 未使用領域が多いファイル。
FILE_ATTRIBUTE_REPARSE_POINT $00000400 再解析ポイントが関連付られています。
FILE_ATTRIBUTE_COMPRESSED $00000800 圧縮されています。
ファイルの場合はファイルそのものが圧縮されています。
ディレクトリの場合は今後そこに格納されるファイルが圧縮されることを示します。
FILE_ATTRIBUTE_OFFLINE $00001000 オフラインの記憶媒体に物理的に移動されたものです。