使用readdir_r读取目录

时间:2012-07-17 21:37:55

标签: c readdir

我一直在检查并与这个程序作战很长一段时间没有成功,希望你能帮助我。

想法是阅读c_Localpath中存储的目录,并将读取的目录复制到c_namesLocal以返回它们。

我在实施中做错了什么?该程序在strcpy上中断,我不知道为什么。

DIR* ptr_dir = opendir(c_Localpath);

char** c_namesLocal = calloc(1, 256);

    size_t numElements = 0;
    int returnCode =0;
    struct dirent ptr_PrevDirEntry;
    struct dirent* ptr_DirEntry = NULL;
    returnCode = readdir_r(ptr_dir, &ptr_PrevDirEntry,
            &ptr_DirEntry);

    while ((returnCode ==0) && (ptr_DirEntry != NULL)) {
        char* name = c_namesLocal[numElements];
        strcpy(name, ptr_DirEntry->d_name);
        ptr_PrevDirEntry = *ptr_DirEntry;
        returnCode = readdir_r(ptr_dir, &ptr_PrevDirEntry,
                &ptr_DirEntry);
        numElements++;
        c_namesLocal = realloc(c_namesLocal, 256 * numElements);
    }

3 个答案:

答案 0 :(得分:6)

很抱歉2年后回复。但我想帮助那些想知道答案的人。 我已经致力于readdir_r的实现,因此我修改了您的代码以使其工作。我不能说代码作为一个整体会起作用,但是,您可以确定您可以在您提到的指定目录中获取下一个文件条目。因此,您可以将这些条目保存到其他var中,并且可以执行您想要的任何操作。

请参阅下文。

DIR* ptr_dir = opendir(c_Localpath);
size_t numElements = 0;
int returnCode =0;
struct dirent *ptr_PrevDirEntry = NULL;
struct dirent *ptr_DirEntry = NULL;
int len_entry;
char *c_namesLocal = NULL;

len_entry = offsetof(struct dirent, d_name) + fpathconf(dirfd(ptr_dir), _PC_NAME_MAX) + 1;
ptr_PrevDirEntry = malloc(len_entry);

if(!ptr_PrevDirEntry)
        exit(0);

for(;;){
        readdir_r(ptr_dir, ptr_PrevDirEntry, &ptr_DirEntry);
        if(!ptr_DirEntry)
            break;
        else
        {
                 if((strcmp(ptr_DirEntry->d_name, ".") != 0) && (strcmp(ptr_DirEntry->d_name, "..") != 0)) // skip "." and ".." file listings
                 {
                    //Perform copying or do whatever you want with the file entry read from the dir "c_Localpath"
                    //Increase numElements to 1 and keep on increasing by 1 on every iteration
                    numElements++;
                    //realloc everytime you find next entry
                    c_namesLocal = realloc(c_namesLocal, 256 * numElements);
                    //copy the next file name in the c_namesLocal[0], c_namesLocal[1] and so on.
                    strcpy(c_namesLocal[numElements - 1], ptr_DirEntry->d_name);
                 }
        }
 }

 //free "ptr_PrevDirEntry" before returning and take care of "c_namesLocal" as well.

上述代码不言自明。我希望它对你有所帮助。干杯:)

答案 1 :(得分:0)

这是一个空指针异常,c_namesLocal实际上指向一个由calloc设置为null的256 / sizeof(char *)char *指针序列,因此c_namesLocal[numElements] == 0。您必须为每个条目分配内存。

答案 2 :(得分:0)

在此代码中:

char* name = c_namesLocal[numElements];
strcpy(name, ptr_DirEntry->d_name);

name以NULL开头。您初始化了指针的向量,但单指针本身仍然指向NULL。你应该为d_name

分配内存
// You no longer need '*name'
c_namesLocal[numElements] = strdup(ptr_DirEntry->d_name);

然后添加支票是明智的:

if (NULL == (c_namesLocal[numElements] = strdup(ptr_DirEntry->d_name)))
{
    // signal out of memory and return
}

当您重新分配指针向量时,同样检查。