0

フォルダ内のいくつかのファイルの変更日を知る必要があります。機能しますが、すべての種類のファイルでは機能しません。たとえば、.c、.txt では動作しますが、.mp4、.jpg、.mp3 などの他のタイプでは動作しません (私が作成しているアプリケーションは、一般的にマルチメディア ファイルで動作する必要があります)。「時間を表示できません。」と出力されるので、問題は 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;
}
4

3 に答える 3

3

を使用し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チェックの外です。フローを返さないか中止しないと、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);
    }
} 

編集2:

初め; 私はそうgetcwd() != NULLあるべきだと言い==ました。変わってください。(私が悪い。)

コードの問題。(さらにいくつかあります)しかし、統計に関しては、d_name from を使用しreaddirます。これは単なるファイル名です。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)) {
于 2012-04-22T15:25:17.900 に答える
0

stat() には完全なパス名を使用する必要があります。Stat は、関心のあるディレクトリを認識していません。

... 
char  bigbuff[PATH_MAX];

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

rc = stat (bigbuff, &b);
...
于 2012-04-22T18:51:19.537 に答える
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;
}

助けてくれてありがとう!

于 2012-04-23T05:54:45.527 に答える