ファイルの最終変更時刻を取得する必要があるCプログラムに取り組んでいます。プログラムは、関数がディレクトリ内の各ファイルをループし、特定のファイルが見つかると別の関数を呼び出して、ファイルの最終変更時刻を確認します。
ディレクトリ内には、mylog.txt.1
、mylog.txt.2
、mylog.txt.3
などがあります。llコマンドを使用してLinuxでディレクトリを一覧表示すると、mylog.txt.1
とmylog.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_mtime
とst_atime
をすべて試しましたが、それらはすべて3月3日を返します。
あなたが提供できるあらゆる助けをありがとう。
これは、タイムゾーンが重要なケースの1つです。 st_mtime
中gmtime
を取得しています。代わりにlocaltime
vizを使用する必要があります。
strftime(date, 20, "%d-%m-%y", localtime(&(attrib.st_ctime)));
これは、ls
がタイムゾーン情報を使用し、表示の一部としてgmtime
を使用した場合、意図的にタイムゾーン情報を省略したためです。
これは私にとってはうまくいきました:
#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));
}
修正するもの:
st_ctime
_を使用します。stat()
が成功することを確認してください。strftime(date, sizeof date, ...
_を使用して、誤ったバッファサイズを使用するリスクを取り除きます。最初に、ファイルシステムが最終変更時間の追跡をサポートしていないと最初に思ったが、他のツールがそれを表示できたと言っているので、何らかの理由でコードが壊れていると思う。
ファイル名が完全なパス名ではない、つまり適切なディレクトリプレフィックスが含まれていない可能性がありますか?