プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

MFCでファイルの情報を取得する。

この記事は2019年06月22日に投稿しました。

f:id:paveway:20190914064630j:plain

目次

  1. はじめに
  2. MFCでファイルの情報を取得する
  3. おわりに

1. はじめに

こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているMFCでファイルの情報を取得する方法についてです。

目次へ

2. MFCでファイルの情報を取得する

MFCでファイルの情報を取得する方法ですが、CFileクラスのGetStatusメソッドを使用します。
GetStatusメソッドを使用すると、以下のファイル情報が取得できます。

フィールド 内容
char m_szFullName ファイルパス(フルパス)
ULONGLONG m_size ファイルサイズ(バイト)
CTime m_ctime ファイル作成日時
CTime m_mtime ファイル最終更新日時
CTime m_atime ファイルアクセス日時
BYTE m_atribute ファイル属性

ファイル属性は、以下の値のファイルの属性が取得できます。

内容
0x01 読み取り専用
0x02 隠しファイル
0x04 システムファイル
0x08 ボリューム
0x10 ディレクトリ
0x20 アーカイブ

実装例

#include <atlpath.h> // CPathに必要

// カレントディレクトリの"ReadMe.txt"ファイルの情報を取得します。
TCHAR path[MAX_PATH];
GetCurrentDirectory(MAX_PATH, path);
CPath filePath(path);
filePath.Append(_T("ReadMe.txt"));

// ファイルの情報を取得します。
CFileStatus fileStatus;
if (CFile::GetStatus(filePath, fileStatus))
{
    // ファイルパス
    CString msg;
    msg.Format(_T("ファイルパス:%s\n"), fileStatus.m_szFullName);
    OutputDebugString(msg);

    // ファイルサイズ
    msg.Format(_T("ファイルサイズ:%d\n"), fileStatus.m_size);
    OutputDebugString(msg);

    // ファイル作成日
    msg = fileStatus.m_ctime.Format(_T("ファイル作成日時:%Y/%m/%d %H:%M:%S\n"));
    OutputDebugString(msg);

    // ファイル最終更新日時
    msg = fileStatus.m_mtime.Format(_T("ファイル最終更新日時:%Y/%m/%d %H:%M:%S\n"));
    OutputDebugString(msg);

    // ファイルアクセス日時
    msg = fileStatus.m_atime.Format(_T("ファイルアクセス日時:%Y/%m/%d %H:%M:%S\n"));
    OutputDebugString(msg);

    // 属性:読み取り専用
    if (fileStatus.m_attribute & CFile::readOnly)
    {
        OutputDebugString(_T("読み取り専用\n"));
    }

    // 属性:隠しファイル
    if (fileStatus.m_attribute & CFile::hidden)
    {
        OutputDebugString(_T("隠しファイル\n"));
    }

    // 属性:システムファイル
    if (fileStatus.m_attribute & CFile::system)
    {
        OutputDebugString(_T("システムファイル\n"));
    }

    // 属性:ボリューム
    if (fileStatus.m_attribute & CFile::volume)
    {
        OutputDebugString(_T("ボリューム\n"));
    }

    // 属性:ディレクトリ
    if (fileStatus.m_attribute & CFile::directory)
    {
        OutputDebugString(_T("ディレクトリ\n"));
    }

    // 属性:アーカイブ
    if (fileStatus.m_attribute & CFile::archive)
    {
        OutputDebugString(_T("アーカイブ\n"));
    }
}

// ファイルが存在しない場合
else
{
  OutputDebugString(_T("ファイルが存在しません"));
}

実行結果

"ReadMe.txt"に読み取り専用、隠しファイル属性を付加して実行した結果です。
ファイルパスの"パス"部分は伏字にしてあります。

ファイルパス:C:\XXXX\ReadMe.txt
ファイルサイズ:5230
ファイル作成日時:2019/06/20 18:03:55
ファイル最終更新日時:2019/06/20 18:03:56
ファイルアクセス日時:2019/06/21 00:00:00
読み取り専用
隠しファイル
アーカイブ

目次へ

3. おわりに

ファイルを開くダイアログでファイルを選択した際、選択したファイルが空ファイルかどうかチェックする方法を検討しました。
最初はファイルを開いてシークポインタを移動量を見ようかと思いましたが、それよりずばりのAPIがよいされていました。

紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。

目次へ


私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。

また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。

EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688

目次へ