Как мне прочитать каталог файлов в C, чтобы получить имена всех файлов, не являющихся папками - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь прочитать заданный каталог filePath и получить имена всех файлов, не являющихся папками, в массив строк. Итак, проблема, которую мне нужно решить, заключается в том, как конкретно не получать файлы типа папок, а также получать имена всех других типов файлов и сохранять их в строковом массиве. Позже я планирую использовать потоки для чтения этих отдельных файлов. но я должен уметь правильно хранить имена файлов. Код, который я сейчас использую, приведен ниже. Следует также отметить, что этот код выполняется дочерним процессом из команды fork (), но я не уверен, имеет ли это отношение к проблеме в любом случае. Любая помощь будет оценена. Спасибо.

Пример. В разделе «Домашняя страница / Документы» есть 4 файла: hello.txt что-то. , и что-то2.dat

Примечание: для меня нормально не делать файлы как I go через каталог, так как сами файлы не будут изменены при любом содержании.

//char* directory is an absolute filePath to the directory
void getFilesFromDirectory(char* directory, pid_t process)
{
    int index =0;
    DIR *dir;
    struct dirent *ent;
    //Can hold only 500 valid files in the folder
    char *stringArray[500];
    if ((dir = opendir (directory)) != NULL) 
    {
        while ((ent = readdir (dir)) != NULL) 
        {            
            strcpy(stringArray[index],ent->d_name);
            index++;         
        }
        closedir (dir);
    } 
    else 
    {
        /* could not open directory */
         perror ("");
    }

   //Everything Below is not related to the problem. Just what I am using it for.

    pthread_t threadArray[index];
    pthread_t senderThread;
    //thread_param_t parameterSender;
    thread_param_t paramterArray[index];

    sem_init(&empty,0,bufferSize);
    sem_init(&full, 0, 0);
    sem_init(&mutex, 0, 1);

    //parameterSender.listItem = listHead;
    pthread_create(&senderThread, NULL, senderFunction, NULL);
    //int threadCounter = 0;
    for(int i =0; i<index; i++)
    {
        paramterArray[i].fileLocation = strcat(directory, stringArray[i]);
        pthread_create(&threadArray[i], NULL, threadFunction, paramterArray + i);

    }
}

1 Ответ

0 голосов
/ 04 марта 2020

Вы можете проверить stringArray на наличие файлов без "." и установите этот указатель на Null. (Отсутствуют файлы)

Лучшим вариантом является:

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


int main()
{
    DIR *folder;
    struct dirent *entry;
    int files = 0;

    folder = opendir(".");
    if(folder == NULL)
    {
        perror("Unable to read directory");
        return(1);
    }
    printf("debug\n");
    while( (entry=readdir(folder)) )
    {
        files++;
        printf("File %3d: %s :: %s\n",
                files,
                entry->d_name,
                (entry->d_type == DT_DIR)?"Directory" : "File"
              );
    }

    closedir(folder);

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