file_status

TR2の<filesystem>を参考にファイル情報のクラスを作成しました。
<hamigaki/filesystem/file_status.hpp>
TR2のfile_statusはファイルの種類しか管理しないので、それ以外の必要なメンバを追加しています。
POSIXのmode_tとMS-DOSファイル属性を混ぜこぜにして、file_type、file_attributes、file_permissionsの3つにまとめました。

// ファイルの種類
enum file_type
{
    status_unknown,
    file_not_found,
    regular_file,
    directory_file,
    symlink_file,
    block_file,
    character_file,
    fifo_file,
    socket_file,
    sparse_file,    // an extension for TR2
    type_unknown
};


// ファイルの属性
typedef unsigned file_attributes;

const file_attributes set_uid       = (1u <<  0);
const file_attributes set_gid       = (1u <<  1);
const file_attributes sticky        = (1u <<  2);
const file_attributes hidden        = (1u <<  3);
const file_attributes for_system    = (1u <<  4);
const file_attributes for_archive   = (1u <<  5);
const file_attributes temporary     = (1u <<  6);
const file_attributes compressed    = (1u <<  7);
const file_attributes offline       = (1u <<  8);
const file_attributes not_indexed   = (1u <<  9);
const file_attributes encrypted     = (1u << 10);


// ファイルのアクセス権
typedef unsigned file_permissions;


タイムスタンプに関しては、Windows/POSIX共に最終更新時間と最終アクセス時間は使用できるので常に保持するようにし、最終状態更新時間(POSIXのみ)とファイル作成時間(Windowsのみ)はオプションとしました。
これらはアクセッサ関数を通して、同じようにアクセスできます。

class file_status
{
public:
    timestamp last_write_time() const
    {
        return last_write_time_;
    }

    void last_write_time(const timestamp& v)
    {
        last_write_time_ = v;
    }


    // ファイル作成時間はオプションなので、チェック関数が必要
    bool has_creation_time() const
    {
        return creation_time_;
    }

    timestamp creation_time() const
    {
        return *creation_time_;
    }

    void creation_time(const timestamp& v)
    {
        creation_time_ = v;
    }

    // ...

private:
    timestamp last_write_time_;
    timestamp last_access_time_;
    boost::optional<timestamp> last_change_time_;
    boost::optional<timestamp> creation_time_;

    // ...
};


明日は実際にシステムからファイル情報を取得する関数を実装してみます。