ホーム >プログラム >Delphi ローテクTips >ID3タグ取得 >ソースコード

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関数を使用します。