为什么我使用readdir进行扫描时不会忽略目录?

时间:2015-05-30 09:31:27

标签: c file gnu directory

这是一段看似非常特殊的C代码。出于某些奇怪的原因,DT_DIR应该忽略文件夹,但它不会:

char** getFiles(char* pathToScan, int size)
{
    DIR *d;
    struct dirent *dir;
    char** filesName;
    int i=0;
    filesName = malloc(sizeof(char*)*size);
    d = opendir(pathToScan);

    if (d)
    {
        while ((dir = readdir(d)) != NULL)
        {
            if (dir->d_type != DT_DIR)
            {
                *(filesName + i-2) = malloc(sizeof(char)*strlen(pathToScan) + sizeof(char)*strlen(dir->d_name));
                strcpy(*(filesName + i-2), pathToScan);
                strcat(*(filesName + i-2), "\\");
                strcat(*(filesName + i-2), dir->d_name);
            }
            i++;
        }
        closedir(d);
    }
    return filesName;
    }
  • 如果我添加到扫描文件夹的文件,则程序崩溃。
  • 如果我扫描的文件夹中没有文件夹,则效果很好。

我的第一个想法是DT_DIR存在问题 (read about DT_DIR),但我不知道该怎么做。

发生了什么事?为什么DT_DIR不会忽略文件夹?

1 个答案:

答案 0 :(得分:1)

我将size理解为要返回的文件数量的限制。 asprintf似乎更简单

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

static char** getFiles(char* pathToScan, int *size)                            
{                                                                              
    DIR *d;                                                                    
    struct dirent *dir;                                                        
    char** filesName;                                                          
    char *f;                                                                   
    int i = 0;                                                                 
    filesName = malloc(sizeof(char*) * *size);                                 
    d = opendir(pathToScan);                                                   

    if (d)                                                                     
    {                                                                          
        while ((dir = readdir(d)) != NULL && i < *size)                        
        {                                                                      
            if (dir->d_type != DT_DIR)                                         
            {                                                                  
                char file[PATH_MAX];                                           
                snprintf(file, sizeof(file), "%s\\%s",                         
                         pathToScan, dir->d_name);                             
                filesName[i++] = strdup(file);                   
                filesName[i++] = f;                                            
            }                                                                  
        }                                                                      
        closedir(d);                                                           
    }                                                                          
    *size = i;                                                                 
    return filesName;                                                          
}

使用示例:

int main(void) {                                                               
   int n = 10;                                                                 
   char **files = getFiles("/home/foo", &n);                                 
   for (int i = 0; i < n; i++) {                                               
       printf("%s\n", files[i]);                                               
   }                                                                           
}