お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





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

"ListViewにDir内のファイル一覧を表示する"





Title: リストビューにディレクトリ内のファイル一覧を表示する。

 指定したディレクトリ内のファイルの一覧をリストビューに表示さ
せます。検索は FindFirst & FindNext を使用、アイコン、ファイル
タイプの情報は SHGetFileInfo を用いています。
 でもエクスプローラよりかなり遅いので改良の余地があるはずです。

uses
  CommCtrl, ShellAPI;

procedure MakeFileList(ListView: TListView; Directory: String);
var
  SearchRec: TSearchRec;
  SHFileInfo: TSHFileInfo;
  OldDirectory: String;
begin
  OldDirectory := GetCurrentDir;
  SetCurrentDir(Directory);

  ListView.Items.BeginUpdate;
  ListView.Items.Clear;
  // ファイルの検索を開始する
  if FindFirst('*.*', faAnyFile, SearchRec) = 0 then
  begin
  repeat
    //if(SearchRec.Name <> '.')and(SearchRec.Name <> '..')then
    with ListView.Items.Add do
    begin
      Caption := SearchRec.Name;
      if (SearchRec.Attr and faDirectory) = 0 then
        SubItems.Add(Format('%dkb', [(SearchRec.Size + $3ff) shr 10]))
      else
        SubItems.Add('');

      // 下のブロックをコメントアウトすると5倍くらい速くなる
      // ので、SHGetFileInfo の実行速度が足かせのようです。
      begin
        SHGetFileInfo(SearchRec.FindData.cFileName, 0,
          SHFileInfo, SizeOf(SHFileInfo),
          SHGFI_SYSICONINDEX or SHGFI_TYPENAME);
        SubItems.Add(SHFileInfo.szTypeName);
        ImageIndex := SHFileInfo.iIcon;
      end;

      SubItems.Add(FormatDateTime('yyyy/mm/dd hh:nn',
                     FileDateToDateTime(SearchRec.Time)));
    end;
  // 次のファイルを探してリピートする
  until FindNext(SearchRec) <> 0;
  SysUtils.FindClose(SearchRec);
  // 標準サイズのアイコンの指定
  ListView_SetImageList(ListView.Handle,
    SHGetFileInfo('.', 0, SHFileInfo, SizeOf(SHFileInfo),
    SHGFI_LARGEICON or SHGFI_SYSICONINDEX),
    LVSIL_NORMAL);
  // スモールサイズのアイコンの指定
  ListView_SetImageList(ListView.Handle,
    SHGetFileInfo('.', 0, SHFileInfo, SizeOf(SHFileInfo),
    SHGFI_SMALLICON or SHGFI_SYSICONINDEX),
    LVSIL_SMALL);
  end;
  ListView.Items.EndUpdate;

  SetCurrentDir(OldDirectory);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MakeFileList(ListView1, Edit1.Text);
  MessageBeep(0);
  ShowMessage('Finished');
end;

 C:\windows で試したら、エクスプローラより約3倍くらい遅いです。
 調べてみると SHGetFileInfo の実行時間がほとんどです。想像ですが
同関数の最後の引数に SHGFI_PIDL を加えて、パス名でなく ITEMID で
ファイルを指定するとエクスプローラ並みの速度になるかもしれません。
 でも私は ITEMID の使い方がわからないんです ;_;)。
(手がかりは IShellFolder::EnumObjects か?)


 私のレベルではここまでです。あとは上級者の方々にお願いします。

               1998/01/30、河邦 正(GCC02240@niftyserve.or.jp)

Original document by 河邦 正         氏 ID:(GCC02240)


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

Copyright 1996-2002 Delphi Users' Forum