我一直在检查并与这个程序作战很长一段时间没有成功,希望你能帮助我。
想法是阅读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);
}
答案 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
}
当您重新分配指针向量时,同样检查。