我想列出“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;
}
最佳答案
您的代码有一些问题。
strcat_s
无法将"\\*"
附加到您的path
字符数组。缓冲区只有足够的空间来存储字符串文字。- 让您声明一个缓冲区
files
,它的内存只够容纳所有文件名,我对此感到不自在。如果再添加一个文件会怎样?然后缓冲区溢出。但是,从技术上讲,它在这种情况下仍然有效。 - 这一行
printf("%s\n",files[numberOfFiles]);
是未定义的行为。您将numberOfFiles
递增到数组中尚未初始化的位置,因此它不会打印文件名。 - 当您调用
FindClose
时,您会使所有存储在文件
中的指针失效。您不能再使用它们。您需要将字符串复制到新缓冲区。
以下代码有效。
#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;
}
关于c - 在 Windows 中使用 C 列出文件夹中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32799170/