3

我一直在检查和解决这个程序,但没有成功,希望你能帮助我。

这个想法是读取存储在其中的目录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);
    }
4

3 回答 3

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.

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

于 2014-11-27T06:48:29.473 回答
0

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

于 2012-07-17T22:02:40.837 回答
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
}

当您重新分配指针向量时进行相同的检查。

于 2012-09-30T10:08:03.927 回答