2015-09-26 89 views
0

我想列出文件夹“C:\ home \ WORK \ Desktop \ Communication”中的文件。该文件夹中有十个文件。我的代码没有错误,但没有打印任何内容。我的错误是什么?声明之后在Windows中使用C列出文件夹中的文件

#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

清除fdata结构:

memset(&fdata, 0, sizeof fdata) 
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所有元素后无效指针将指向*(fdata.cFileName)哪些将在FindClose(hFind)发布。换句话说,据我所知,你应该复制(或重复fdata.cFileNamefiles[i]每次迭代。

2

你的代码有几个错误。

  1. strcat_s不能追加"\\*"path字符数组。缓冲区只有足够的空间存储字符串文字。
  2. 我很不舒服,让你声明一个缓冲区files只有足够的内存来适应所有的文件名。如果你添加一个文件会发生什么?然后缓冲区溢出。但是,在这种情况下它仍然会在技术上起作用。
  3. 此行printf("%s\n",files[numberOfFiles]);是未定义的行为。您将numberOfFiles递增到数组中尚未初始化的位置,因此它不打印文件名。
  4. 当您致电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; 
} 
相关问题