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

标签 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;
}

最佳答案

您的代码有一些问题。

  1. strcat_s 无法将 "\\*" 附加到您的 path 字符数组。缓冲区只有足够的空间来存储字符串文字。
  2. 让您声明一个缓冲区files,它的内存只够容纳所有文件名,我对此感到不自在。如果再添加一个文件会怎样?然后缓冲区溢出。但是,从技术上讲,它在这种情况下仍然有效。
  3. 这一行 printf("%s\n",files[numberOfFiles]); 是未定义的行为。您将 numberOfFiles 递增到数组中尚未初始化的位置,因此它不会打印文件名。
  4. 当您调用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/

相关文章:

c# - Visual Studio 2019 : Shortcut key to collapse this method only

C# 如何添加一个ListView ClickListener

c# - 在 C# 中检查数字的 TextBox 方法

c++ - 如何修复 "State Error (active) E0513 a value of type “const wchar_t *” 无法分配给类型为 “wchar_t *” 的实体“

具有 32 位值的 c 枚举

java - 如何通过 java 和 c 之间的套接字正确发送数据?

c - 在开始时使用 "\r"更新进度条字符串,跳过或错过迭代

c - 如何让子线程等待主线程

c - 如何在 C 中反转 LFSR 和移位寄存器?

c++ - 介入时如何跳过VS 2008中的常见类(class)?