ファイルサイズと作成日付を表示する

VC++ でファイルサイズと作成日付を調べて文字形式に編集して表示します。
日付が 1961 年と表示されるのは 日付領域がゼロ のときで、MS/DOS が基準とする時刻を刻み始めた年です。

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

プロジェクトの設定

  1. 新規プロジェクトで[空のプロジェクト](Size) を作成します。
  2. Size.cpp のソースコードです。
    /*********************************************/
    /*★ ファイルのサイズを表示する    前田 稔 ★*/
    /*********************************************/
    #include    <windows.h>
    char        fname[24]= {  "C:\\TMP\\B.TXT"  };
    HANDLE      hFile;
    DWORD       fsize,hiwd;
    char        buf[MAX_PATH];
    FILETIME    ft,lt;
    SYSTEMTIME  sTime;
    
    //★ Windows Main 関数
    int PASCAL  WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
    {
        hFile = CreateFile(fname,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
        if (hFile==INVALID_HANDLE_VALUE)    return FALSE;
        fsize= GetFileSize(hFile,&hiwd);
        //fsize= GetFileSize(hFile,NULL);
        CloseHandle(hFile);
        wsprintf(buf,"%s File Size %d",fname,fsize);
        MessageBox(NULL,buf,"ファイルサイズです",MB_OK);
        return TRUE;
    }
        
  3. GetFileSize() でファイルサイズを取得します。
    下位の DWORD(32 bit) が fsize に、上位の DWORD(32 bit) が hiwd に格納されます。
    上位 DWORD が不要のときは NULL を指定します。
    fsize= GetFileSize(hFile,&hiwd);
  4. wsprintf() で編集して表示します。

【演習】

  1. ファイルの作成日付を取得して表示して下さい。
    ファイルディレクトリに格納されているのは FILETIME 構造体です。
  2. ファイルの作成日付を表示するときのヒントです。
    GetFileTime() で作成日付を標準時で取得します。
    FileTimeToLocalFileTime() でローカルタイムに変換します。
    FileTimeToSystemTime() で「日付・時刻の形式」に変換します。
    wsprintf() で編集して表示します。
        FILETIME    ft,lt;
        SYSTEMTIME  sTime;
    
        GetFileTime()
        FileTimeToLocalFileTime()
        FileTimeToSystemTime()
        
  3. 編集と表示の方法は タイトルバーに時刻を表示する を参照して下さい。
    作成日付が表示できるようになったら、エクスプローラの日付と比べて正しいことを確かめて下さい。

【1601年】

「1601年」と表示された方はおられますか?(^_^;
HANDLE が OPEN されているか(CLOSE されていないか)調べて下さい。
1601年と表示されるのは 日付領域がゼロ のときで、MS/DOS がカウント開始する基準の年です。
FILETIME は世界標準時で、1601年1月1日からの100ナノ秒間隔の時刻を表す64ビットの値です。

【NOTE】

  1. GetFileTime() で取得できるのは FILETIME 構造体です。
    FILETIME は世界標準時で 1601年1月1日 からの100ナノ秒間隔の時刻を表す64ビットの値です。
        FILETIME    ft;
        GetFileTime(hFile,NULL,NULL,&ft);
        
  2. FILETIME 構造体の定義です。
        typedef struct _FILETIME {
    	DWORD dwLowDateTime;
    	DWORD dwHighDateTime;
        } FILETIME, *PFILETIME;
        
    dwLowDateTime 下位32ビット
    dwHighDateTime 上位32ビット
  3. 標準時を日本時間に変換します。
        FILETIME    ft,lt;
        FileTimeToLocalFileTime(&ft,&lt);
        
  4. 日付を編集して表示するには SYSTEMTIME 構造体に変換します。
    FILETIME構造体から SYSTEMTIME構造体 に変換する関数としてFileTimeToSystemTime()があります。
    SYSTEMTIME構造体からFILETIME構造体に変換する関数としてSystemTimeToFileTime()があります。
        SYSTEMTIME  sTime;
        FILETIME    ft,lt;
        FileTimeToSystemTime(&lt,&sTime);
        SystemTimeToFileTime(&sTime,&ft);
        
        typedef struct _SYSTEMTIME {
            WORD wYear;
            WORD wMonth;
            WORD wDayOfWeek;
            WORD wDay;
            WORD wHour;
            WORD wMinute;
            WORD wSecond;
            WORD wMilliseconds;
        } SYSTEMTIME, *PSYSTEMTIME;
        
    wYear 年を示します
    wMonth 月を示します。1=1月,2=2月,...
    wDayOfWeek 曜日を示します。0=日曜,1=月曜,...
    wDay 日を示します
    wHour 時を示します
    wMinute 分を示します
    wSecond 秒を示します
    wMilliseconds ミリ秒を示します

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