2012-04-22 6 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

どのエラーが発生しているのかを知るために、「時間を表示できません」というprintfではなく、 'perror'を使います。 – Mat

答えて

3

使用perror()st_mtimeも使用しないでください。 dir_p -> d_nameが今度はおそらくローカライズの問題がある、存在していないので、それがあることを確認

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

99%。

あなたのような何かを行うことができます:また

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

を。ファイルの状態を確認している場合は、->f_nameでなく、->d_nameであるべきですか? - (あなたがコースから外れ、ファイル名にd_nameを使用しない限り。)

そして、あなたのfclose(fp)があなたのfp == NULLチェック外です。フローを返さない、または他の方法で中断しないので、fopenが失敗した場合、SIGSEGVが発生する可能性があります。


編集:このようなもので何を得ますか?

#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に関しては、readdirのd_nameを使用します。これはファイル名のみです。 dir + filenameではありません。したがって、あなたは、すなわち取得:

すなわちなり
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では「このようなファイルやディレクトリはありません」と表示されます。しかし、私はなぜファイルがそこにあるのか理解できません。また、これらのファイルでは、md5ハッシュを計算しているので、うまくいけば問題は日付だけです。 – phcaze

+0

@phcaze: 'dir_p-> d_name'は何の印字をしますか?また、あなたはそれにいくつかの変更を行う場合は、現在の作業ディレクトリをチェックすることができます。上記の新しいコードのようなものを使用してください。何が印刷されますか? – Morpfh

+0

dir_p-> d_nameは、ファイル名/Users/user/Desktop/file.mp4でパスを出力します。 あなたのコードでは "/Users/user/Desktop/file.mp4 getcwd()エラー:未定義のエラー:0"の画面に表示されます。 – phcaze

0

あなたはSTATのための完全なパス名を使用する必要があります() 。インスタット社は、あなたが興味を持っているどのディレクトリを知りません

... 
char bigbuff[PATH_MAX]; 

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

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

はい、それは問題でした! :)ありがとう。しかし、なぜそれは私にいくつかのファイルだけでエラーを与える? – phcaze

0

これは、ファイルのディレクトリをスキャンし、修正日とTXT出力ファイルにそれらを印刷するために、最終的な作業コードです:。

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

ありがとうございました!

関連する問題