由于某种原因,当我遍历目录中的所有文件/文件夹,并检查我对S_ISDIR的当前选择时,它只适用于“。”和“..”目录。即使我有3个文件(A,B,C)和2个文件夹(subdir,seconddir)
代码:
//will read all files inside current directory, logic steps down into any sub directory found
int readDir(char * opt_basedir) // opt_basedir is the folder within the root repository of the .exe file, in this case "test"
{
struct dirent *dirr;
DIR *directory; // used to keep track of current directory
struct stat fileStat; //used for lstat to hold stat info for the document
directory = opendir("."); // open root
directory = opendir(opt_basedir); // iterate straight into the selected folder
dirr = readdir(directory);
while(dirr){
lstat(dirr->d_name, &fileStat);
if(S_ISDIR(fileStat.st_mode))
{
printf("only prints of . and .. =>" );
}
//if file (open)
//readCopy(opt_basedir, &block, &offset);
// else folder
//function call
printf("%s\n",dirr->d_name);
dirr = readdir(directory);
}
}
不确定我在这里做错了什么...... :(
答案 0 :(得分:2)
您必须首先确保opt_basedir
是您当前的工作目录。
您可以执行类似
的操作chdir(opt_basedir);
directory = opendir(".");
而不是
directory = opendir(opt_basedir);
另一种方法是创建绝对路径:
directory = opendir(opt_basedir);
/* error check */
while ((dirr = readdir(directory))) {
char *path = malloc(strlen(opt_basedir) + strlen(dirr->d_name) + 1);
/* error check */
strcpy(path, opt_basedir);
strcat(path, dirr->d_name);
lstat(path, ...);
/* other code */
free(path);
}
这是一个完整的测试程序(注意:readDir()
中的输出仅用于调试):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
void
readDir(const char *path)
{
DIR *dp;
struct dirent *dr;
struct stat fs;
dp = opendir(path);
if (dp == NULL) {
perror("opendir");
return;
}
printf("%s:\n", path);
while ((dr = readdir(dp))) {
if (!strcmp(dr->d_name, ".") || !strcmp(dr->d_name, "..")) {
continue;
}
char *abs_path = malloc(strlen(path) + strlen(dr->d_name) + 2);
if (!abs_path) {
perror("malloc");
exit(EXIT_FAILURE);
}
strcpy(abs_path, path);
strcat(abs_path, "/");
strcat(abs_path, dr->d_name);
if (lstat(abs_path, &fs) < 0) {
free(abs_path);
continue;
}
if (S_ISDIR(fs.st_mode)) {
readDir(abs_path);
}
printf("\t%s\n", dr->d_name);
free(abs_path);
}
}
int
main(int argc, char *argv[])
{
if (argc != 2) {
fprintf(stderr, "Usage: %s dir\n", argv[0]);
exit(EXIT_FAILURE);
}
readDir(argv[1]);
exit(EXIT_SUCCESS);
}
答案 1 :(得分:0)
除了d_name
,struct dirent
也有一个名为d_type
的成员。
然后为了完成你的任务,就这样做吧。像:
struct dirent * dirr;
DIR * directory = opendir(opt_basedir);
if (directory) {
while ((dirr = readdir(directory)) != nullptr) {
if (DT_DIR == dirr->d_type) {
...
}
}
...
}
...
是您可能想要添加的任何代码。这里DT_DIR
可以帮助您检查它是否是目录。您不需要使用stat()
或S_ISDIR
等。 (因为您已经使用过dirent
)
希望这个答案可以帮助你和其他有类似问题的人。