Søgning af filer i C på Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Hvordan ville man søge efter filer på en computer?
Måske leder efter bestemte udvidelser.


Jeg skal gentage gennem alle filerne og undersøge filnavne.


Sig, jeg ønskede at finde alle filer med en .code udvidelse.

Bedste reference


For Windows vil du gerne se på FindFirstFile () og FindNextFile () funktionerne. Hvis du vil implementere en rekursiv søgning, kan du bruge GetFileAttributes () til at tjekke for FILE\_ATTRIBUTE\_DIRECTORY. Hvis filen faktisk er en mappe, fortsæt den med din søgning. [5] [6]

Andre referencer 1


En fin indpakning til FindFirstFile er dirent.h for windows (google dirent.h Toni Ronkko)



#define S\_ISREG(B) ((B)&\_S\_IFREG)
#define S\_ISDIR(B) ((B)&\_S\_IFDIR)

static void
scan\_dir(DirScan *d, const char *adir, BOOL recurse\_dir)
{
    DIR *dirfile;
    int adir\_len = strlen(adir);

    if ((dirfile = opendir(adir)) != NULL) {
        struct dirent *entry;
        char    path[MAX\_PATH + 1];
        char    *file;

        while ((entry = readdir(dirfile)) != NULL)
        { 
            struct stat buf;
            if(!strcmp(".",entry->d\_name) || !strcmp("..",entry->d\_name))
                continue;

            sprintf(path,"\%s/\%.*s", adir, MAX\_PATH-2-adir\_len, entry->d\_name);

            if (stat(path,&buf) != 0)
                continue;

            file = entry->d\_name;
            if (recurse\_dir && S\_ISDIR(buf.st\_mode) )
                scan\_dir(d, path, recurse\_dir);
            else if (match\_extension(path) && \_access(path, R\_OK) == 0) // e.g. match .code
                strs\_find\_add\_str(&d->files,&d->n\_files,\_strdup(path));
        }
        closedir(dirfile);
    }
    return;
}

Andre referencer 2


Brug FindFirstFile() eller FindNextFile() funktioner og en rekursiv algoritme til at krydse undermapper.

Andre referencer 3


FindFirstFile ()/FindNextFile () vil gøre jobbet til at finde listen over filer i mappen. For at gøre rekursiv søgning gennem undermapper kan du bruge \_splitpath [7]


at opdele stien i mappe og filnavne, og brug derefter den resulterende katalogdetalje til at foretage en rekursiv katalogsøgning.