【C言語】ファイルの作成日時・更新日時を取得する

この記事では、C言語を使ってファイルの作成日時や更新日時を取得する方法について解説します。

具体的には、statという関数を使ってファイルの情報を取得し、どのように日時を表示するかを学びます。

プログラミング初心者の方でも理解できるように、サンプルコードや実行結果を交えながら説明しますので、ぜひ最後まで読んでみてください。

目次から探す

C言語でのファイルの作成日時・更新日時の取得方法

C言語では、ファイルの作成日時や更新日時を取得するために、主にstat関数を使用します。

この関数は、指定したファイルに関する情報を取得し、stat構造体に格納します。

以下では、stat構造体の概要から、実際に日時を取得する方法までを詳しく解説します。

stat構造体の概要

stat構造体は、ファイルに関するさまざまな情報を保持するためのデータ構造です。

この構造体には、ファイルのサイズ、所有者、パーミッション、作成日時、更新日時などの情報が含まれています。

以下は、stat構造体の主なメンバーです。

項目説明
st_devデバイスID
st_inoinode番号
st_modeファイルの種類とパーミッション
st_nlinkハードリンクの数
st_uid所有者のユーザーID
st_gid所有者のグループID
st_sizeファイルサイズ
st_atime最終アクセス時刻
st_mtime最終更新時刻
st_ctime最終状態変更時刻

特に、st_mtimeはファイルの内容が最後に変更された日時、st_ctimeはファイルのメタデータが最後に変更された日時を示します。

stat関数の使用方法

stat関数を使用するには、まずsys/stat.hヘッダーファイルをインクルードする必要があります。

次に、stat関数を呼び出し、ファイル名とstat構造体のポインタを引数として渡します。

以下は、stat関数の基本的な使い方です。

#include <stdio.h>
#include <sys/stat.h>
int main() {
    struct stat fileStat;
    if (stat("example.txt", &fileStat) < 0) {
        perror("stat");
        return 1;
    }
    // ここでfileStatにファイル情報が格納される
    return 0;
}

このコードでは、example.txtというファイルの情報を取得し、fileStatに格納しています。

ファイルが存在しない場合や、他のエラーが発生した場合には、perror関数を使ってエラーメッセージを表示します。

st_ctimeとst_mtimeの意味

st_mtimest_ctimeは、ファイルの日時情報を取得するための重要なメンバーです。

  • st_mtime: 最終更新時刻。

ファイルの内容が最後に変更された日時を示します。

  • st_ctime: 最終状態変更時刻。

ファイルのメタデータ(パーミッションや所有者など)が最後に変更された日時を示します。

これらの情報は、time_t型で格納されており、通常はUNIX時間(1970年1月1日からの秒数)で表されます。

取得した日時のフォーマット

取得した日時を人間が読みやすい形式に変換するには、localtime関数strftime関数を使用します。

以下は、st_mtimest_ctimeをフォーマットする例です。

#include <stdio.h>
#include <sys/stat.h>
#include <time.h>
void printFileTimes(struct stat fileStat) {
    char buffer[80];
    // 最終更新時刻
    struct tm *mtime = localtime(&fileStat.st_mtime);
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", mtime);
    printf("最終更新時刻: %s\n", buffer);
    // 最終状態変更時刻
    struct tm *ctime = localtime(&fileStat.st_ctime);
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", ctime);
    printf("最終状態変更時刻: %s\n", buffer);
}

この関数では、localtimeを使ってtime_ttm構造体に変換し、strftimeでフォーマットしています。

全体のコード

以下は、ファイルの作成日時と更新日時を取得し、表示する全体のコードです。

#include <stdio.h>
#include <sys/stat.h>
#include <time.h>
void printFileTimes(struct stat fileStat) {
    char buffer[80];
    // 最終更新時刻
    struct tm *mtime = localtime(&fileStat.st_mtime);
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", mtime);
    printf("最終更新時刻: %s\n", buffer);
    // 最終状態変更時刻
    struct tm *ctime = localtime(&fileStat.st_ctime);
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", ctime);
    printf("最終状態変更時刻: %s\n", buffer);
}
int main() {
    struct stat fileStat;
    if (stat("example.txt", &fileStat) < 0) {
        perror("stat");
        return 1;
    }
    printFileTimes(fileStat);
    return 0;
}

このプログラムを実行すると、指定したファイルの最終更新時刻と最終状態変更時刻が表示されます。

ファイル名を適宜変更して、他のファイルの日時情報も取得できます。

注意点とベストプラクティス

C言語でファイルの作成日時や更新日時を取得する際には、いくつかの注意点やベストプラクティスがあります。

これらを理解しておくことで、より安全で効率的なプログラムを書くことができます。

プラットフォーム依存性

C言語は多くのプラットフォームで動作しますが、ファイルシステムの実装やstat関数の動作はプラットフォームによって異なる場合があります。

特に、Unix系のシステム(LinuxやmacOS)とWindowsでは、ファイルのメタデータの扱いが異なることがあります。

例えば、Unix系のシステムでは、st_ctimeはファイルの最終変更時刻を示しますが、Windowsでは作成時刻になります。

このため、プラットフォームに依存しないコードを書くためには、条件コンパイルを使用して、OSごとに異なる処理を行うことが重要です。

#ifdef _WIN32
// Windows用の処理
#else
// Unix系システム用の処理
#endif

ファイルの存在確認

ファイルの作成日時や更新日時を取得する前に、対象のファイルが存在するかどうかを確認することが重要です。

存在しないファイルに対してstat関数を呼び出すと、エラーが発生します。

これを防ぐために、access関数を使用してファイルの存在を確認することができます。

#include <unistd.h>
if (access("filename.txt", F_OK) != -1) {
    // ファイルは存在する
} else {
    // ファイルは存在しない
}

権限の確認

ファイルの作成日時や更新日時を取得するためには、対象のファイルに対する適切な権限が必要です。

特に、他のユーザーが所有するファイルに対しては、読み取り権限がないとstat関数は失敗します。

ファイルの権限を確認するためには、stat構造体のst_modeフィールドを使用します。

#include <sys/stat.h>
struct stat fileStat;
if (stat("filename.txt", &fileStat) == 0) {
    if (fileStat.st_mode & S_IRUSR) {
        // 読み取り権限あり
    } else {
        // 読み取り権限なし
    }
} else {
    // stat関数が失敗した場合の処理
}

これらの注意点を考慮することで、より堅牢で信頼性の高いプログラムを作成することができます。

ファイルのメタデータを扱う際には、常にエラーハンドリングを行い、プラットフォームに依存しないコードを書くことを心がけましょう。

目次から探す