2012-05-04 28 views
8

Dosyanın son değiştirilme zamanını almam gereken bir C programı üzerinde çalışıyorum. Programın yaptığı işlev, bir dizinin içindeki her dosyaya bir işlevdir ve belirli bir dosya (lar) bulunduğunda, dosyanın son değiştirilme zamanlarını kontrol etmek için başka bir işlevi çağırır. Ben ll komutu ben mylog.txt.1 ve mylog.txt.2 4 Mayıs'ta modifiye edilmiş ve mylog.txt.3 3 Mayıs tarihinde güncellenmiştir görebilirsiniz kullanarak linux dizin listelediğinizde dizin içindeSon değişiklik zamanını linux içinde alın.

bir mylog.txt.1, mylog.txt.2 ve mylog.txt.3 vb vardır.

Program, bu dosyaların her birini denetlediğinde, her zaman 3. olabilir. Aşağıda kullandığım kod.

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; 
} 

Ben st_ctime, yani st_mtime ve st_atime tüm farklı varyasyonları denedim ama hepsi dönüş 3 may.

Sağladığınız her türlü yardım için teşekkür ederiz.

+0

belki temizleme ilk: tampon uzun 10 iken neden strftime' '20 büyüklüğünde geçmesi? Neden stat'in dönüş değerini kontrol etmiyorsunuz? "Stat" başarısız olursa, bir çöp değeri ayrıştırıyorsunuz. – mvds

+0

@mvds bir yazım hatası – Boardy

+0

farklı dosya yolundan geçtiğinizden emin olun, ayrıca "attrib.st_ctime" de "son değişiklik zamanını" verecektir, eğer "son değişiklik zamanını" kullanmanız gerekiyorsa " attrib.st_mtime " – ray

cevap

9

Bu, saat dilimlerinin önemli olduğu durumlardan biridir. st_mtime'un gmtime sürümünü alıyorsunuz. Bunun yerine localtime viz kullanıyor olmalısınız.

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

ls saat dilimi bilgisini kullanır ve ekranın bir parçası olarak gmtime kullanıldığında, kasten herhangi zaman dilimi bilgisini ihmal çünkü bu.

+1

Yine de, işlevinizde kontrol etme daha fazla hata öneririm – Petesh

3

şeyler düzeltmek için:

  • , yani st_ctime doğru alanını kullanın.
  • stat() sonucunu kullanmadan önce başarılı olduğunu kontrol edin. Yanlış arabellek boyutunu kullanma riskini kaldırmak için strftime(date, sizeof date, ... kullanın.

Dosya sisteminizin son değiştirilen süreyi izlemeyi henüz desteklemediğinden şüpheleniyorum, ancak diğer araçların bunu göstermeyi başardığını söylediğinizden, kodun her ne sebepten olursa olsun kırıldığından şüpheleniyorum.

Dosya adları tam yol adları değil, yani uygun dizin önekini içermiyor olabilir mi?

9

Bu benim için iyi çalıştı:

#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)); 
} 
İlgili konular