Unicode非対応版。
ウムラウトのようなUnicode文字(以下たんにUnicode文字と表記)が含まれているファイルのプロパティは取得できない(カレントディレクトリを変更し短いファイル名にすることである程度は可能)
Unicode文字を含んだファイルを扱う必要がなければ一番簡単。
procedure gpcFilePropertyListGet(slList: TStrings; const sFile: String);
var
oleShell,
oleFolder,
oleFolderItem: OleVariant;
i: Integer;
ls_Path, ls_Name: String;
begin
if (FileExists(sFile)) then begin
ls_Path := ExtractFilePath(sFile);
ls_Name := ExtractFileName(sFile);
try
oleShell := CreateOleObject('Shell.Application');
oleFolder := oleShell.NameSpace (OleVariant(ls_Path));
oleFolderItem := oleFolder.ParseName(OleVariant(ls_Name));
slList.Clear;
for i := 0 to 40 do begin
slList.Add(oleFolder.GetDetailsOf(oleFolderItem, i));
end;
finally
oleShell := Unassigned;
oleFolder := Unassigned;
oleFolderItem := Unassigned;
end;
end;
end;
Unicode対応版・その1
Unicode文字が含まれているファイルのプロパティも取得可能。
ただしslListがTStringsなので取得したプロパティにUnicode文字がある場合は代替文字に変換される。
procedure gpcFilePropertyListGet(slList: TStrings;
const sWFile:
WideString);
//ファイルのプロパティをslListにセットする
var
oleShell,
oleFolder,
oleFolderItem: OleVariant;
i: Integer;
ls_WPath, ls_WName:
WideString;
begin
if (
gfnbFileExists(sWFile))
then begin
ls_WPath :=
gfnsFilePathGet(sWFile);
ls_WName :=
gfnsFileNameGet(sWFile);
try
oleShell := CreateOleObject('Shell.Application');
oleFolder := oleShell.NameSpace (OleVariant(ls_WPath));
oleFolderItem := oleFolder.ParseName(OleVariant(ls_WName));
slList.Clear;
for i := 0
to 40
do begin
slList.Add(oleFolder.GetDetailsOf(oleFolderItem, i));
end;
finally
oleShell := Unassigned;
oleFolder := Unassigned;
oleFolderItem := Unassigned;
end;
end;
end;
Unicode対応版・その2
ここで、せっかくUnicode文字を含んだファイルのプロパティを得ることができたのだからプロパティ中にあるUnicode文字もちゃんと扱えるようにしたい、と思うのが人情というもので。そのためにはWideStringをリストで持つことができればOKなわけです。で、その場合TListを使うというのが正しい人の道かと思うのですが、いかんせん私TListが良く解らない。なので少しくらい道を踏み外してもとりあえず使い慣れてるTStringListでやれないもんかと頭をひねってみました。
まぁ要はWideStringとAnsiStringの可逆変換ができればいいわけです。リストに入れるときはWideStringからAnsiStringに変換して、その変換したAnsiStringでリストを保持しておいて使うときにWideStringに戻して使うと。そういう手間も変換のためのオーバーヘッドもある邪道・外道なアプローチ。
procedure gpcFilePropertyListGet(slList: TStrings; sWFile:
WideString);
//ファイルのプロパティをslListにセットする
var
oleShell,
oleFolder,
oleFolderItem: OleVariant;
i: Integer;
ls_WPath, ls_WName:
WideString;
begin
if (
gfnbFileExists(sWFile))
then begin
ls_WPath :=
gfnsFilePathGet(sWFile);
ls_WName :=
gfnsFileNameGet(sWFile);
try
oleShell := CreateOleObject('Shell.Application');
oleFolder := oleShell.NameSpace (OleVariant(ls_WPath));
oleFolderItem := oleFolder.ParseName(OleVariant(ls_WName));
slList.Clear;
for i := 0
to 40
do begin
slList.Add(
gfnsWideToAnsiEx(oleFolder.GetDetailsOf(oleFolderItem, i)));
end;
finally
oleShell := Unassigned;
oleFolder := Unassigned;
oleFolderItem := Unassigned;
end;
end;
end;
その1版にgfnsWideToAnsiEx関数を付け加えただけなんですが、この関数を使うことでStringListでUnicode文字を含んだ文字列を(元に戻せる形で)保持することができるので手間はかかりますが便利です。使うときは対になるgfnsAnsiToWideEx関数を使用します。