在Windows中使用C列出文件夹中的文件

时间:2015-09-26 16:13:20

标签: c visual-studio

我想列出此文件夹“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;
}

3 个答案:

答案 0 :(得分:2)

您的代码存在一些问题。

  1. strcat_s无法将"\\*"附加到您的path字符数组中。缓冲区只有足够的空间来存储字符串文字。
  2. 让您声明一个只有足够内存以容纳所有文件名的缓冲区files,我感到很不舒服。如果再添加一个文件会发生什么?然后缓冲区溢出。但是,在这种情况下,它仍然在技术上有效。
  3. 此行printf("%s\n",files[numberOfFiles]);是未定义的行为。您将numberOfFiles增加到数组中尚未初始化的位置,因此它不会打印文件名。
  4. 当您致电FindClose时,您使files中存储的所有指针无效。你不能再使用它们了。您需要将字符串复制到新缓冲区。
  5. 以下代码有效。

    #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 )