17

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

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

ただし、プログラムがこれらの各ファイルをチェックすると、常に 5 月 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_mtimeandをすべて試しましst_atimeたが、それらはすべて 5 月 3 日に返されます。

ご協力いただきありがとうございます。

4

3 に答える 3

22

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

#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));
}
于 2012-05-04T10:12:36.027 に答える
16

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

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

これは、lsがユーザーのタイムゾーン情報を使用しているためgmtimeであり、ディスプレイの一部として使用した場合、意図的にタイムゾーン情報を省略したためです。

于 2012-05-04T10:01:21.403 に答える
4

修正すべき点:

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

私はあなたのファイルシステムが単に最終変更時刻の追跡をサポートしていないのではないかと最初に疑っていましたが、他のツールがそれを表示することができたとあなたが言っているので、何らかの理由でコードが壊れているのではないかと思います.

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

于 2012-05-04T10:01:16.680 に答える