Directry を List View に表示する

Directry を検索して「名前/サイズ/更新日付」を List View に表示します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 新規プロジェクトで(DirLVew)を作成します。
  2. ページ先頭の画像を参考にして DialogBox を作成して下さい。
    DialogBox 全体に ListView を貼り付けて下さい。
    スタイルの表示(View)から「レポート」を選択して下さい。
    キャプションとIDを次のように設定して下さい。
    BOX キャプション ID
    DialogBox Dialog List View IDD_DIALOG1
    ListView IDC_LIST1
  3. commctrl.h をインクルードして、#pragma comment(lib,"comctl32.lib") を記述します。
    dir は検索するフォルダーです。
    HEAD[] は ListView の見出しで、CX[] は Column(項目) の幅です。
        #include    <commctrl.h>
        #pragma     comment(lib,"comctl32.lib")
    
        char        dir[64]= { "C:\\WINDOWS\\*.*" };
        HWND        hList;
        char        HEAD[][16]=
        {  "名前", "サイズ", "更新日付"  };
        int         CX[]=  {  240, 80, 120 };
        
  4. WinMain() では DialogBox を表示するだけです。
    WM_INITDIALOG: の記述です。
    ListView のハンドルを格納して SetLView() を呼びます。
        case WM_INITDIALOG:
            hList= GetDlgItem(hDlg,IDC_LIST1);
            SetLView();
            break;
        
  5. フォルダーに格納されているファイルを列挙して List View に登録する関数です。
    ファイルの列挙は フォルダーのファイルを列挙する を参照して下さい。
    //★ Search Directry
    void  SetLView()
    {   WIN32_FIND_DATA fd;
        HANDLE          hFind;
        BOOL            bRet= TRUE;
        LV_ITEM         item;
        FILETIME        ft;
        SYSTEMTIME      sTime;
        int             i;
        char            buf[32];
    
        // List View に Column を設定
        SetColumn();
        ListView_DeleteAllItems(hList);
        hFind= FindFirstFile(dir,&fd);
        for(i=0; hFind!=INVALID_HANDLE_VALUE && bRet; i++)
        {   // フォルダー(ファイル)名を表示します
            if (!(fd.dwFileAttributes&(FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_SYSTEM)))
            {   // ファイルサイズを表示します
            }
            // 日付と作成時刻を表示します
            bRet= FindNextFile(hFind,&fd);
        }
        FindClose(hFind);
    }
        
  6. Column を設定する関数 SetColumn() は前回と同じ要領です。
    C# でも同様のプログラムを作成しています。
    超初心者のプログラム入門(C#)から ListView Directory を参照して下さい。
    リンクがエラーになるときは「前田稔の超初心者のプログラム入門」から辿って下さい。

【ヒント】

WinBase.h で定義されている WIN32_FIND_DATA 構造体の定義です。
typedef struct _WIN32_FIND_DATA {
    DWORD       dwFileAttributes;
    FILETIME    ftCreationTime;
    FILETIME    ftLastAccessTime;
    FILETIME    ftLastWriteTime;
    DWORD       nFileSizeHigh;
    DWORD       nFileSizeLow;
    DWORD       dwReserved0;
    DWORD       dwReserved1;
    CHAR        cFileName[ MAX_PATH ];
    CHAR        cAlternateFileName[ 16 ];
} WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;

ファイルサイズの編集
wsprintf(buf,"%dKB",((fd.nFileSizeHigh<<6)+((fd.nFileSizeLow+1023)>>10)));

日付と作成時刻の編集
FileTimeToLocalFileTime(&(fd.ftLastWriteTime),&ft);
FileTimeToSystemTime(&ft,&sTime);
wsprintf(buf,"%04d/%02d/%02d %02d:%02d",sTime.wYear,sTime.wMonth,
              sTime.wDay,sTime.wHour,sTime.wMinute);

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

超初心者のプログラム入門(Win32API C++)