2012-05-04 23 views
8

Pracuję nad programem C, w którym potrzebuję uzyskać czas ostatniej modyfikacji pliku. Program wykonuje pętle przez każdy plik w katalogu i po znalezieniu konkretnego pliku wywołuje inną funkcję w celu sprawdzenia ostatnich czasów modyfikacji pliku.Pobierz ostatni czas modyfikacji pliku w Linuksie

W katalogu znajduje się mylog.txt.1, mylog.txt.2 i mylog.txt.3 itd. Kiedy listy katalogu w systemie Linux za pomocą komendy LL widzę, że mylog.txt.1 i mylog.txt.2 zostały zmodyfikowane w dniu 4 maja i mylog.txt.3 został zmodyfikowany na 3 maja.

Gdy program sprawdza każdy z tych plików, jednak zawsze zwraca 3 maja. Poniżej znajduje się kod, którego używam.

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

Próbowałem wszystkie różne odmiany st_ctime, tj st_mtime i st_atime ale wszyscy 3-sze powrót może.

Dziękujemy za pomoc.

+0

może porządki najpierw: dlaczego zdać rozmiaru 20 do 'strftime' gdy bufor jest 10 długo? dlaczego nie sprawdzić zwracanej wartości 'stat'? Jeśli 'stat' nie powiedzie się, parsujesz wartość śmieci. – mvds

+0

@mvds przykro nam, że był to typo – Boardy

+0

upewnij się, że przechodzisz inną ścieżkę, także "attrib.st_ctime" da "czas ostatniej zmiany statusu", jeśli szukasz "czasu ostatniej modyfikacji" musisz użyć " attrib.st_mtime " – ray

Odpowiedz

9

Jest to jeden z tych przypadków, w których strefy czasowe mają znaczenie. Otrzymujesz gmtime z st_mtime. Powinieneś zamiast tego używać localtime viz.

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

to dlatego ls używa strefy czasowej, a kiedy używany gmtime jako części wyświetlacza, to celowo pominięto żadnych informacji czasowej.

+1

Wciąż chciałbym polecić o wiele więcej sprawdzania błędów w twojej funkcji, chociaż – Petesh

3

warte naprawić:

  • Użyj odpowiedniego pola, tj st_ctime.
  • Sprawdź, czy stat() powiedzie się przed użyciem jego wyniku.
  • Użyj strftime(date, sizeof date, ..., aby usunąć ryzyko użycia niewłaściwego rozmiaru bufora.

Najpierw podejrzewałem, że twój system plików nie obsługuje śledzenia ostatniego czasu modyfikacji, ale ponieważ mówisz, że inne narzędzia potrafią to pokazać, podejrzewam, że kod z jakiegoś powodu się zepsuł.

Czy możliwe jest, że nazwy plików nie są pełnymi nazwami ścieżek, tj. Nie zawierają właściwego prefiksu katalogu?

9

To działało w porządku dla mnie:

#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)); 
} 
Powiązane problemy