【问题标题】:Why does my scanning with readdir not ignore directories?为什么我用 readdir 扫描不会忽略目录?
【发布时间】:2015-05-30 09:31:26
【问题描述】:

这是一段看起来很奇特的 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 不忽略文件夹?

【问题讨论】:

  • 你没有分配足够的内存。
  • i++ 应该在 if 中并删除 -2
  • 你的访问太糟糕了,这甚至都不好笑。
  • @Ôrel,谢谢,这是为了解决文件夹问题?
  • 您在第一次通过循环时索引到 filesName[-2],您将 strcpy() + strcat()ing 到一个太小的两个字节的缓冲区中(一个用于"\\",一个用于@ 987654328@)。甚至推测表现出未定义行为的程序也是没有用的。

标签: c file gnu directory


【解决方案1】:

我将大小理解为要返回的文件数量的限制。 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]);                                               
   }                                                                           
}  

【讨论】:

  • ...如果目录中的文件超过*size
  • @Ôrel 谢谢你的时间。但它是崩溃。 asprintf 是什么?我的编译器没有找到它。 (大小是文件的数量:))
  • 这个函数是 GNU 扩展,不是 C 或 POSIX。在文件顶部添加 #define _GNU_SOURCE 或 malloc 一个 char* 并使用 snprintf
  • 我删除了 asprintf。你真正想做什么?
  • @Ôrel 谢谢。我非常感谢你。但它不会忽略文件夹,毕竟我的目的..
猜你喜欢
  • 2015-12-03
  • 2012-10-05
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多