在 Ubuntu(Linux)下,使用 C/C++ 通过 readdir 遍历目录,通常配合 opendir / closedir 使用。下面给你一个完整、常用的示例。
opendir() 打开目录,得到 DIR*readdir() 读取目录项(struct dirent). 和 ..)closedir() 关闭目录#include <stdio.h>
#include <dirent.h>
int main(int argc, char *argv[])
{
DIR *dir;
struct dirent *entry;
if (argc < 2) {
printf("Usage: %s <directory>\n", argv[0]);
return 1;
}
dir = opendir(argv[1]);
if (dir == NULL) {
perror("opendir");
return 1;
}
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
gcc readdir_example.c -o readdir_example
./readdir_example /path/to/dir
. 和 ..while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
printf("%s\n", entry->d_name);
}
#include <sys/stat.h>
struct stat st;
char path[1024];
snprintf(path, sizeof(path), "%s/%s", argv[1], entry->d_name);
stat(path, &st);
if (S_ISDIR(st.st_mode))
printf("[DIR] %s\n");
else
printf("[FILE] %s\n", entry->d_name);
void list_dir(const char *path)
{
DIR *dir = opendir(path);
struct dirent *entry;
if (!dir) return;
while ((entry = readdir(dir))) {
if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, ".."))
continue;
char full[1024];
snprintf(full, sizeof(full), "%s/%s", path, entry->d_name);
printf("%s\n", full);
struct stat st;
stat(full, &st);
if (S_ISDIR(st.st_mode))
list_dir(full);
}
closedir(dir);
}
readdir 不是线程安全的readdir_r(已逐步废弃)d_name 只含文件名,不含完整路径readdir 是标准、稳定做法如果你需要:
告诉我你的具体需求即可。