如何使用C或C ++获取目录中的文件列表?
如何从C或C ++代码中确定目录中的文件列表?
我不能执行'ls'
命令并从我的程序中解析结果。
在小而简单的任务中,我不使用boost,我使用dirent.h ,它也可用于Windows:
DIR *dir;
struct dirent *ent;
if ((dir = opendir ("c:src")) != NULL) {
/* print all the files and directories within directory */
while ((ent = readdir (dir)) != NULL) {
printf ("%sn", ent->d_name);
}
closedir (dir);
} else {
/* could not open directory */
perror ("");
return EXIT_FAILURE;
}
它只是一个小的头文件,并且不需要使用像boost这样的基于模板的大方法就可以完成大部分简单的工作(无需冒犯,我喜欢提升!)。
Windows兼容性层的作者是Toni Ronkko。 在Unix中,它是一个标准头文件。
2017年更新 :
在C ++ 17中,现在有一种正式的方式来列出文件系统的文件: std::filesystem
。 下面是源代码Shreevardhan的一个很好的答案:
#include <string>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
std::string path = "/path/to/directory";
for (auto & p : fs::directory_iterator(path))
std::cout << p << std::endl;
}
如果您使用C ++ 17方法,请考虑提高他的答案。
不幸的是,C ++标准没有定义以这种方式处理文件和文件夹的标准方式。
由于没有跨平台的方式,最好的跨平台方式是使用boost文件系统模块等库。
跨平台升压方法:
给定目录路径和文件名的以下函数递归地搜索目录及其子目录中的文件名,返回一个bool,如果成功,则返回找到的文件的路径。
bool find_file(const path & dir_path, // in this directory,
const std::string & file_name, // search for this name,
path & path_found) // placing path here if found
{
if (!exists(dir_path))
return false;
directory_iterator end_itr; // default construction yields past-the-end
for (directory_iterator itr(dir_path); itr != end_itr; ++itr)
{
if (is_directory(itr->status()))
{
if (find_file(itr->path(), file_name, path_found))
return true;
}
else if (itr->leaf() == file_name) // see below
{
path_found = itr->path();
return true;
}
}
return false;
}
来自上面提到的boost页面。
对于基于Unix / Linux的系统:
你可以使用opendir / readdir / closedir。
搜索目录“`name”的示例代码是:
len = strlen(name);
dirp = opendir(".");
while ((dp = readdir(dirp)) != NULL)
if (dp->d_namlen == len && !strcmp(dp->d_name, name)) {
(void)closedir(dirp);
return FOUND;
}
(void)closedir(dirp);
return NOT_FOUND;
源代码来自上述手册页。
对于基于Windows的系统:
您可以使用Win32 API FindFirstFile / FindNextFile / FindClose函数。
以下C ++示例显示您最少使用FindFirstFile。
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
void _tmain(int argc, TCHAR *argv[])
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
if( argc != 2 )
{
_tprintf(TEXT("Usage: %s [target_file]n"), argv[0]);
return;
}
_tprintf (TEXT("Target file is %sn"), argv[1]);
hFind = FindFirstFile(argv[1], &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
printf ("FindFirstFile failed (%d)n", GetLastError());
return;
}
else
{
_tprintf (TEXT("The first file found is %sn"),
FindFileData.cFileName);
FindClose(hFind);
}
}
上述msdn页面的源代码。
C ++ 17现在有一个std::filesystem::directory_iterator
,可以用作
#include <string>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
std::string path = "/path/to/directory";
for (auto & p : fs::directory_iterator(path))
std::cout << p << std::endl;
}
另外, std::filesystem::recursive_directory_iterator
也可以迭代子目录。
上一篇: How can I get the list of files in a directory using C or C++?