Intereting Posts

stat () возвращает ошибку

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

Это код:

#include  #include  #include  #include  #include  #include  #include  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 d_name[0] != '.') { //printf("%s\n", dir_p -> d_name); len2 = strlen(dir_p -> d_name); for (i=0;i 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; } 

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

      стат: 
             При успешном завершении возвращается нуль.  
             При ошибке возвращается -1, а errno устанавливается соответствующим образом. 

    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 . Поскольку вы не возвращаете или иным образом не прерываете stream, вы рискуете SIGSEGV, если fopen терпит неудачу.


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

     #include  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", ...) 

    Самое простое быстрое исправление (tho dirty):

     /* you need to terminate the system string after your for loop */ system3[i + len + 6] = '\0'; system(system3); if (!stat(system3 + 6, &b)) { 

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

     ... char bigbuff[PATH_MAX]; sprintf( bigbuff, "%s/%s", destinationFolder, dir_p->d_name); rc = stat (bigbuff, &b); ... 

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

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

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