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 |
オフラインの記憶媒体に物理的に移動されたものです。 |