Как перечислить только имена файлов, указанные пользователем в каталоге в C? - PullRequest
0 голосов
/ 27 марта 2020

Я знаю, как распечатать все файлы из каталога, но как мне найти один указанный c файл в этом каталоге, используя имя, предоставленное ранее пользователем?

#include <dirent.h>
#include <stdio.h>

int main(void)
{
    DIR *d;
    struct dirent *dir;
    char a,b;
    printf("Path:(eg.c:/): ");
    scanf("%s",&a);
    d = opendir (&a);
    if (d)
    {
        while ((dir = readdir(d)) != NULL)
        {
            printf("%s\n", dir->d_name);
        }
        closedir(d);
    }
    return(0);
}

1 Ответ

1 голос
/ 27 марта 2020

Из комментариев:
Я хотел бы знать, как реализовать это в моем коде, потому что я никогда не использовал эти функции .

Поскольку вы используете Windows, FindFirstFile и FindNextFile можно использовать для поиска в каталоге списка filespecs , оттуда Вы можете просто использовать strstr, чтобы изолировать нужный файл, сравнивая результаты поиска с желаемым именем файла вашего пользователя.

Вот пример, который можно изменить для ваших целей:

#include <stdio.h>
#include <string.h>
#include <windows.h>

void find(char* path,char* file)
{
    static int found =0;
    HANDLE fh;
    WIN32_FIND_DATA wfd;
    int i=0;
    int j=0;
    fh=FindFirstFile(path,&wfd);
    if(fh)
    {
        if(strcmp(wfd.cFileName,file)==0)
        {
            path[strlen(path)-3]='\0';
            strcat(path,file);
            FindClose(fh);
            return;
        }
        else
        {
            while(FindNextFile(fh,&wfd) && found ==0)
            {              
                if(strcmp(wfd.cFileName,file)==0)
                {
                    path[strlen(path)-3]='\0';
                    strcat(path,file);
                    FindClose(fh);
                    found =1;
                    return;
                }
                if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY &&
                    strcmp(wfd.cFileName,"..")!=0 && strcmp(wfd.cFileName,".")!=0)
                {
                    path[strlen(path)-3]='\0';
                    strcat(path,wfd.cFileName);
                    strcat(path,"\\*.*");
                    find(path,file);
                }
            }

            if(found==0)
                {
                for(i=strlen(path)-1;i>0;i--)
                {
                    if(j==1 && path[i]=='\\')
                    {
                        path[i]='\0';
                        strcat(path,"\\*.*");
                        break;
                    }
                    if(path[i]=='\\')
                        j=1;
                }
            }
        }
        FindClose(fh);
    }



}

int main()
{
    TCHAR path[512] = "C:\\*.*";
    find(path,"notepad.exe");
    printf("%s\n",path);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...