2012-05-04 8 views
8

私はファイルの最終更新時刻を取得する必要があるCプログラムで作業しています。プログラムが行うことは、関数がディレクトリ内の各ファイルをループし、特定のファイルが見つかったときに、ファイルの最終変更時刻をチェックする別の関数を呼び出します。私はmylog.txt.1mylog.txt.2は5月4日に変更されたとmylog.txt.3は、5月3日に変更されたことがわかりますllコマンドを使用して、Linuxでディレクトリの一覧を表示するときlinuxのファイルの最終更新時刻を取得する

ディレクトリ内mylog.txt.1mylog.txt.2mylog.txt.3などがあります。

ただし、これらのファイルのそれぞれをチェックすると、常に3rd 3rdが返されます。以下は私が使用しているコードです。

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のすべてのさまざまなバリエーションを試してみたが、それらはすべて5月3日を返します。

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

+0

を多分クリーンアップ最初:バッファが10の長さである一方で、なぜstrftime' 'に20のサイズを渡しますか?なぜ 'stat'の戻り値をチェックしないのですか? 'stat'が失敗した場合、あなたはガベージ値を解析しています。 – mvds

+0

@mvds申し訳ありませんでした。タイプが – Boardy

+0

です。別のファイルパスを渡していることを確認してください。また、「最終変更時刻」を探している場合は「attrib.st_ctime」が「最後のステータス変更の時刻」を表示します。 attrib.st_mtime " – ray

答えて

9

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

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

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

+1

私はまだ多くのエラーをあなたの関数でチェックすることをお勧めします。 – Petesh

3

もの:

  • はすなわちst_ctime、適切なフィールドを使用してください。
  • 結果を使用する前にstat()が成功したことを確認してください。
  • 不適切なバッファサイズを使用するリスクを回避するには、strftime(date, sizeof date, ...を使用してください。

私はまずファイルシステムが最後に変更された時刻の追跡をサポートしていないと思っていましたが、他のツールで表示することができると言われています。

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

9

これは私のためにうまく働いた:

#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)); 
} 
関連する問題