2013-07-03 3 views
0

Я хочу получить дату изменения файла, а затем отформатировать его в удобную для человека дату. Я запускаю программу на C, которая получает информацию о том, когда последний файл был последним. My C Code содержит sytem cmd, который содержит ряд egreps, awks, seds, разделенных трубами. Используя sed или awk или что-то подобное, как я могу конвертировать 06 в июне (это может быть любой месяц, так что массив или что-то требуется) Я пытаюсь добиться, чтобы в итоге получилась строка, похожая на:Форматировать метку времени в тексте

My C содержит:

char string1[100] = ""; 
    #define MAXCHAR 100 
    FILE *fp; 
    char str[MAXCHAR], str2[MAXCHAR]; 
    char* filename = "newfile"; 

    /* 
    stat: run 'stat' on the dtlName file to display status information. 
    egrep: search for the pattern 'Modify' and print the lines containing it. 
    awk: Get columns 2 & 3 
    sed: replace the . with a space, leaving 3 columns of output 
    awk: only print cols 1 & 2 to newfile 
    sed: replace '-' with ' ' in newfile 
    awk: format output in newfile 
    */ 
    sprintf(string1, "/bin/stat %s \ 
        | egrep Modify \ 
        | /bin/awk '{print $2, $3}' \ 
        | /bin/sed 's/\\./ /g' \ 
        | /bin/awk '{print $1, $2}' \ 
        | /bin/sed 's/-/ /g' \ 
        | /bin/awk '{print $3,$2\", \"$1,\"at\",$4}' > newfile" 
        , dtlName); 
    system(string1); 
    fp = fopen(filename, "r"); 
    while (fgets(str, MAXCHAR, fp) != NULL) 
      sprintf(str2,"%s", str); 

    /* Write information to file */ 
    DisplayReportFile (report); 
    ReportEntry (report,L"Source file: %s, Created: %s\n\n",dtlName,str2); 
+0

не должно быть «sprintf (str,« ...>% s », ..., filename); '? –

+1

Это действительно впечатляюще. –

ответ

1

Вот рабочая версия этой же программы:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <time.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char ** argv) 
{ 
     if (argc < 2) exit(1); 

     char *filename = argv[1]; 

     struct stat st; 
     char s[1000]; 
     if (stat(filename, &st)) 
       exit(2); 

     struct tm *mdtime = localtime(&st.st_mtime); 
     strftime(s, sizeof(s), "%D", mdtime); 

     printf("%s\n", s); 
} 

См strftime для большего числа форматов.

1

Обычно вы использовали бы fstat() и strftime().

1

Почему бы не использовать

#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 

int stat(const char *restrict path, struct stat *restrict buf); 

(от man -s2 stat)

это даст вам time_t с момента последней модификации

, то вы можете использовать ctime_r или asctime_r или mktime, чтобы получить соответствующая информация.

0

Обязательно ли сочетание awk sed? Почему бы просто не вызвать fstat в файле и извлечь из него дату изменения? Затем вы можете преобразовать это в строку с вызовом ctime().

0

Я не знаю, полезно ли это. Но однажды я сделал что-то подобное. Получая эту строку просто обработать эту строку и получить Month после этого вы можете использовать

if(strcmp(May,string1)==0) 
return 5; 

вы можете получить желаемый результат.

Смежные вопросы