我想列出此文件夹“C:\ home \ WORK \ Desktop \ Communication”中的文件。此文件夹中有十个文件。我的代码没有错误,但它没有打印任何东西。我的错是什么?
#include<stdio.h>
#include<Windows.h>
#include<string.h>
int main(int argc,char *argv[])
{
char path[]="C:\\home\\WORK\\Desktop\\Communication";
strcat_s(path,sizeof(path),"\\*");
WIN32_FIND_DATA fdata;
HANDLE hFind =INVALID_HANDLE_VALUE;
int numberOfFiles=0;
char *files[10];
hFind = FindFirstFile(path,&fdata);
while((FindNextFile(hFind,&fdata))!=0)
{
files[numberOfFiles]=fdata.cFileName;
numberOfFiles++;
printf("%s\n",files[numberOfFiles]);
}
FindClose(hFind);
return 0;
}
答案 0 :(得分:2)
您的代码存在一些问题。
strcat_s
无法将"\\*"
附加到您的path
字符数组中。缓冲区只有足够的空间来存储字符串文字。files
,我感到很不舒服。如果再添加一个文件会发生什么?然后缓冲区溢出。但是,在这种情况下,它仍然在技术上有效。printf("%s\n",files[numberOfFiles]);
是未定义的行为。您将numberOfFiles
增加到数组中尚未初始化的位置,因此它不会打印文件名。FindClose
时,您使files
中存储的所有指针无效。你不能再使用它们了。您需要将字符串复制到新缓冲区。以下代码有效。
#include<stdio.h>
#include<Windows.h>
#include<string.h>
int main(int argc,char *argv[])
{
char path[] = "C:\\home\\WORK\\Desktop\\Communication\\*.*";
//strcat_s(path,sizeof(path),"\\*");
WIN32_FIND_DATA fdata;
HANDLE hFind =INVALID_HANDLE_VALUE;
int numberOfFiles=0;
char* files[10]; /* you may want to expand this buffer */
hFind = FindFirstFile(path,&fdata);
while((FindNextFile(hFind,&fdata))!=0)
{
size_t len = strlen(fdata.cFileName);
files[numberOfFiles] = malloc(len + 1 * sizeof*files); // len + 1 for null-terminator
strcpy_s(files[numberOfFiles], len, fdata.cFileName);
printf("%s\n",files[numberOfFiles]);
numberOfFiles++; /* increment this AFTER you print files[numberOfFiles] */
}
FindClose(hFind);
for(int i = 0; i < (sizeof(file)/sizeof(*file)); ++i) {
free(file[i]);
}
return 0;
}
答案 1 :(得分:1)
似乎,你应该移动
numberOfFiles++
过去
printf("%s\n",files[numberOfFiles]);
或者
while((FindNextFile(hFind,&fdata))!=0)
{
files[numberOfFiles]=fdata.cFileName;
printf("%s\n", files[numberOfFiles++]);
}
与
相同while((FindNextFile(hFind,&fdata))!=0)
{
printf("%s\n", files[numberOfFiles++] = fdata.cFileName);
}
我不太了解WinAPI,但我觉得,files
之后所有FindClose(hFind)
都会包含无效指针,files
的所有元素都将指向{{} 1}}将在*(fdata.cFileName)
中发布。换句话说,据我所知,您应该在每次迭代时复制(或复制)FindClose(hFind)
到fdata.cFileName
。
答案 2 :(得分:0)
在声明后清除fdata
结构:
memset( &fdata, 0, sizeof fdata )