2012-04-22 2 views
0

Мне нужно знать дату изменения некоторых файлов в папке. Он работает, но не со всеми типами файлов. Например, он работает с .c, .txt, но он не работает с другими типами .mp4, .jpg и .mp3 (приложение, которое я создаю, должно работать с мультимедийными файлами в целом). Он печатает «Невозможно отобразить время». Поэтому я предполагаю, что проблема связана с stat(). Благодарю.stat() возвращает ошибку

Это код:

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

char parola[12]="", hash[32]="", esadecimale[1000]="", system3[100]="./md5 "; 
int i, len, len2; 
int bytes; 
char cwd[1024]; 

int main(void) 
{ 
char t[100] = ""; 
struct stat b; 
DIR *dp; 
char destinationFolder[100] = "/Users/mattiazeni/Desktop/Prova/"; //Me la passa da sopra 
struct dirent *dir_p; 
dp = opendir(destinationFolder); 
if (dp == NULL) exit(1); 

len = strlen(destinationFolder); 

for (i=0;i<len;i++) { 
    system3[i+6]=destinationFolder[i]; 
} 

while((dir_p = readdir(dp)) != NULL) { 
    if (dir_p -> d_name[0] != '.') { 
     //printf("%s\n", dir_p -> d_name); 
     len2 = strlen(dir_p -> d_name); 
     for (i=0;i<len2;i++) { 
      if (dir_p -> d_name[i] == ' '){ //Mi serve per correggere i nomi dei file con spazi 
       system3[i+len+6]='\\'; 
      } 
      else system3[i+len+6]=dir_p -> d_name[i]; 
     } 
     system(system3); //Passa il valore a md5 che calcola l'hash e lo stampa nel file che ci serve insieme al persorso/nome del file 

     FILE *fp; 
     if((fp=fopen("userDatabase.txt", "ab"))==NULL) { 
      printf("Error while opening the file..\n"); 
      fclose (fp); 
     } 
     else { 
      if (!stat(dir_p -> d_name, &b)) { 
      strftime(t, 100, "%d/%m/%Y %H:%M:%S", localtime(&b.st_mtime));   //C'è ancora qualche errore!! 
      fprintf(fp, "%s", t);   
      } 
      else { 
       perror(0); 
       fprintf(fp, "error"); 
      } 
      fprintf(fp, " initialized"); 
      fprintf(fp, "\n"); 
     } 
     fclose (fp); 
     for (i=len+6;i<len+6+len2;i++) { 
      system3[i]=' '; 
     } 
    } 
} 
closedir(dp); 
return 0; 
} 
+3

использовать 'perror', а не« отображать время »printf, чтобы узнать, какую ошибку вы получаете. – Mat

ответ

3

Использование perror(). Также не следует использовать st_mtime?

stat: 
     On success, zero is returned. 
     On error, -1 is returned, and errno is set appropriately.

99% уверен, что это происходит потому, что dir_p -> d_name не существует, что, в свою очередь, вероятно, из-за проблемы локализации.

Вы могли бы сделать что-то вроде:

fprintf(stderr, 
     "Unable to stat %s\n", 
     dir_p->d_name); 
perror(0); 

Также; не должно быть ->f_name, а не ->d_name, если вы проверяете статус файла? - (. Если вы не используете d_name для имени файла с курсом)

И ваш fclose(fp) находится за пределами fp == NULL проверки. Поскольку вы не возвращаете или иным образом не прерываете поток, вы рискуете SIGSEGV, если ошибка fopen.


Редактировать: Что вы получаете с чем-то вроде этого?

#include <unistd.h> 

char cwd[1024]; 

... 


} else { 
    fprintf(stderr, 
      "Unable to stat '%s'\n", 
      dir_p->d_name); 
    perror(0); 

    if (getcwd(cwd, sizeof(cwd)) == NULL) { 
     perror("getcwd() error"); 
    } else { 
     fprintf(stderr, 
       "in directory '%s'\n", 
       cwd); 
    } 
} 

Edit2:

Во-первых; Я сказал, что getcwd() != NULL должен быть ==. Смена. (Плохо мною.)

Проблема в вашем коде. (Есть еще несколько), но относительно stat - вы используете d_name от readdir. Это только Имя файла; не dir + имя файла. Таким образом, Вы получаете именно:

stat(dir_p->d_name, ...) 

Который становится именно:

stat("file.mp4", ...) 

Самый простой быстро исправить (Тхо немытый) будет:

/* you need to terminate the system string after your for loop */ 
system3[i + len + 6] = '\0'; 

system(system3); 

if (!stat(system3 + 6, &b)) { 
+0

Спасибо за ответы. Я использую dir_p -> d_name, потому что я просматриваю каталог, чтобы узнать, какие файлы в нем, а затем для каждого файла, который я хочу узнать о дате изменения. С perror я получаю «Нет такого файла или каталога». Но я не понимаю, почему, файлы есть .. Кроме того, потому что в этих файлах я вычисляю хэш хед, и это хорошо работает, проблема заключается только в дате. – phcaze

+0

@phcaze: Что делает 'dir_p-> d_name' печатать как? Также; вы можете проверить текущий рабочий каталог, если вы вносите некоторые изменения в это. Используйте что-то вроде нового кода выше. Что он печатает? – Morpfh

+0

dir_p-> d_name печатает путь с именем файла, /Users/user/Desktop/file.mp4. С кодом, который он печатает на экране "/Users/user/Desktop/file.mp4 getcwd() error: Неопределенная ошибка: 0". – phcaze

0

Вы должны использовать полный путь к файлу для стат() , Stat не знает, в какой каталог вы заинтересованы в

... 
char bigbuff[PATH_MAX]; 

sprintf(bigbuff, "%s/%s", destinationFolder, dir_p->d_name); 

rc = stat (bigbuff, &b); 
... 
+0

Да, это была проблема! :) Благодаря. Но почему это дает мне ошибку только с некоторыми файлами? – phcaze

0

Это последний рабочий код для сканирования каталога для файлов, а также распечатать их на выходном текстовый файл с датой изменения:.

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

char system3[6]="./md5 "; 

int main(void) 
{ 
char t[100] = ""; 
char bigbuff[200]; 
struct stat b; 
char destinationFolder[100] = "/Users/mattiazeni/Desktop/Prova"; //Me la passa da sopra 
DIR *dp; 
struct dirent *dir_p; 
dp = opendir(destinationFolder); 
if (dp == NULL) exit(1); 
while((dir_p = readdir(dp)) != NULL) { 
    if (dir_p -> d_name[0] != '.') { 
     sprintf(bigbuff, "%s%s/%s",system3, destinationFolder, dir_p->d_name); 
     system(bigbuff); 

     FILE *fp; 
     if((fp=fopen("userDatabase.txt", "ab"))==NULL) { 
      printf("Error while opening the file..\n"); 
      fclose (fp); 
     } 
     else { 
      sprintf(bigbuff, "%s/%s", destinationFolder, dir_p->d_name); 
      if (!stat(bigbuff, &b)) { 
      strftime(t, 100, "%d/%m/%Y %H:%M:%S", localtime(&b.st_mtime));   //C'è ancora qualche errore!! 
      fprintf(fp, "%s", t);   
      } 
      else { 
       perror(0); 
       fprintf(fp, "error"); 
      } 
      fprintf(fp, "\n"); 
     } 
     fclose (fp); 
    } 
} 
closedir(dp); 
return 0; 
} 

Спасибо всем за помощь!

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