【问题标题】:List of all files inside the folder and its subfolders in WindowsWindows 中文件夹及其子文件夹中所有文件的列表
【发布时间】:2019-06-19 04:28:23
【问题描述】:

我想通过访问“C:\windows\system32\Tasks”目录中的所有文件来列出在任务计划程序下运行的所有文件。

程序应递归地保持打开目录中的子文件夹并列出所有文件。我目前使用 Windows 操作系统

我尝试使用 COM 库,但它不显示子文件夹中的任务。我有 60 个任务,但它只显示 12 个。所以,我尝试遍历 Tasks 文件夹。

#include <stdio.h>
#include <dirent.h>

int main(void)
{
    DIR *dir;
    struct dirent *de; 
    if ((dir = opendir("C:\\Windows\\System32\\Tasks")) != NULL);
    {
        printf("The startup Programs are:\n");
        while ((de = readdir(dir)) != NULL)
          {
            printf("%s\n", de->d_name);
          }
    closedir(dir);
    }
   getchar();
}

我希望输出显示当前文件夹和子文件夹中的所有文件。 但是,输出只显示第一个文件夹的名称并退出。

【问题讨论】:

  • 我删除了 C++ 标签:除非 OP 另有说明,否则这看起来真的像 C。@OP: C != C++
  • @πάνταῥεῖ,适用于 unix。他需要它用于 Windows。 unix versin 将无法正常工作。
  • @πάνταῥεῖ,您的两个链接都指向同一个解决方案。
  • @Paul “他在 Windows 上需要它。” 提到了 POSIX 函数。无论如何都应该工作。
  • Raisa,你应该使用FindFirstFileFindNextFile

标签: c windows directory msdn


【解决方案1】:

由于显然没有在 windows 下递归列出目录的完整、简单的示例,这里有一个:

#include <windows.h>
#include <stdio.h>

void listdirs(char *dir, char *mask)
{
    char fspec[1024], fname[1024];
    WIN32_FIND_DATA     dta;
    HANDLE              hDta;

    sprintf(fspec,"%s/%s",dir, mask);

    if ((hDta= FindFirstFile (fspec, &dta)) != INVALID_HANDLE_VALUE) {
        do {
            if ( !(dta.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
            {
                printf ("%s/%s\n", dir, dta.cFileName);
            }
            else
            {
                if (strcmp(dta.cFileName,".")!=0 && strcmp(dta.cFileName,"..")!=0 )
                {
                    sprintf (fname, "%s\\%s", dir, dta.cFileName);
                    listdirs(fname, mask);
                }
            }
        } while (FindNextFile (hDta, &dta));

        FindClose(hDta);
    }
}
int main (int argc, char *argv[])
{
    listdirs(argv[1],argv[2]);  // Usage: progname c:\MyDir *.*
    return 0;
}

【讨论】:

  • 这适用于其他文件夹,但不适用于 system32\tasks 文件夹。
  • 如果你查看文件夹的安全属性,你会发现只有管理员可以列出目录的内容。
  • 如果您在sprintf(fname.. 之后添加printf ("%s/\n",fname);,您将看到它遍历目录但不列出任何文件。
  • 我已以管理员身份运行 Codeblocks,但仍无法读取文件名。
  • 我也很茫然,为什么它不适用于 system32/tasks。它与安全属性有关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2015-02-16
  • 1970-01-01
  • 2014-05-08
  • 2015-03-29
  • 1970-01-01
相关资源
最近更新 更多