web-dev-qa-db-ja.com

Linuxでファイルの最終変更時刻を取得する

ファイルの最終変更時刻を取得する必要があるCプログラムに取り組んでいます。プログラムは、関数がディレクトリ内の各ファイルをループし、特定のファイルが見つかると別の関数を呼び出して、ファイルの最終変更時刻を確認します。

ディレクトリ内には、mylog.txt.1mylog.txt.2mylog.txt.3などがあります。llコマンドを使用してLinuxでディレクトリを一覧表示すると、mylog.txt.1mylog.txt.2が5月4日に変更され、mylog.txt.3が5月3日に変更されたことがわかります。

ただし、プログラムがこれらの各ファイルをチェックすると、常に3月3日が返されます。以下は私が使用しているコードです。

void getFileCreationTime(char *filePath)
{
    struct stat attrib;
    stat(filePath, &attrib);
    char date[10];
    strftime(date, 10, "%d-%m-%y", gmtime(&(attrib.st_ctime)));
    printf("The file %s was last modified at %s\n", filePath, date);
    date[0] = 0;
}

私はst_ctimeのさまざまなバリエーション、つまりst_mtimest_atimeをすべて試しましたが、それらはすべて3月3日を返します。

あなたが提供できるあらゆる助けをありがとう。

16
Boardy

これは、タイムゾーンが重要なケースの1つです。 st_mtimegmtimeを取得しています。代わりにlocaltime vizを使用する必要があります。

strftime(date, 20, "%d-%m-%y", localtime(&(attrib.st_ctime)));

これは、lsがタイムゾーン情報を使用し、表示の一部としてgmtimeを使用した場合、意図的にタイムゾーン情報を省略したためです。

13
Petesh

これは私にとってはうまくいきました:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>
#include <sys/types.h>

void getFileCreationTime(char *path) {
    struct stat attr;
    stat(path, &attr);
    printf("Last modified time: %s", ctime(&attr.st_mtime));
}
17
qwertz

修正するもの:

  • 適切なフィールド、つまり_st_ctime_を使用します。
  • 結果を使用する前に、stat()が成功することを確認してください。
  • _strftime(date, sizeof date, ..._を使用して、誤ったバッファサイズを使用するリスクを取り除きます。

最初に、ファイルシステムが最終変更時間の追跡をサポートしていないと最初に思ったが、他のツールがそれを表示できたと言っているので、何らかの理由でコードが壊れていると思う。

ファイル名が完全なパス名ではない、つまり適切なディレクトリプレフィックスが含まれていない可能性がありますか?

3
unwind