C中的目录遍历
Directory traversing in C
我试图搜索这个问题,但没有找到满意的答案。所以这是我的问题:
我正在使用以下代码变体遍历目录:
我.
#include<stdio.h>
#include<sys/types.h>
#include<dirent.h>
#include<string.h>
#include<sys/stat.h>
void traverseDirectory(char name[100]){
DIR* dir;
struct dirent *ent;
struct stat states;
dir = opendir(name);
while((ent=readdir(dir)) != NULL){
stat(ent->d_name,&states);
if(!strcmp(".", ent->d_name) || !strcmp("..", ent->d_name)){
continue;
}
else{
printf("%s/%s\n",name,ent->d_name);
if(S_ISDIR(states.st_mode)){
strcat(name,"/");
strcat(name,ent->d_name);
traverseDirectory(name);
}
}
}
closedir(dir);
}
int main(){
char path[100];
printf("Enter the path:\n");
scanf("%s",&path);
traverseDirectory(path);
}
这个遍历子目录,但在遍历第一个子目录并打印其文件后出现分段错误。
输出为:
Enter the path:
/home/harshad/dump
/home/harshad/dump/TraverseDirectory.c
/home/harshad/dump/temp
/home/harshad/dump/temp/temptest.txt
Segmentation fault
II.
#include<stdio.h>
#include<sys/types.h>
#include<dirent.h>
#include<string.h>
#include<sys/stat.h>
void traverseDirectory(char name[100]){
DIR* dir;
struct dirent *ent;
struct stat states;
dir = opendir(name);
while((ent=readdir(dir)) != NULL){
stat(ent->d_name,&states);
if(!strcmp(".", ent->d_name) || !strcmp("..", ent->d_name)){
continue;
}
else{
printf("%s/%s\n",name,ent->d_name);
if(S_ISDIR(ent->d_type & DT_DIR)){
strcat(name,"/");
strcat(name,ent->d_name);
traverseDirectory(name);
}
}
}
closedir(dir);
}
int main(){
char path[100];
printf("Enter the path:\n");
scanf("%s",&path);
traverseDirectory(path);
}
这个打印给定目录中的所有文件和子目录,但不遍历子目录。它的输出是:
Enter the path:
/home/harshad/dump
/home/harshad/dump/TraverseDirectory.c
/home/harshad/dump/temp
/home/harshad/dump/TraverseDirectory1.out
/home/harshad/dump/dump
/home/harshad/dump/test.txt
/home/harshad/dump/SortMarks.c
/home/harshad/dump/TraverseDirectory.out
/home/harshad/dump/TraverseDirectoryTemp.out
/home/harshad/dump/TraverseDirectory1.c
/home/harshad/dump/TraverseDirectoryTemp.c
/home/harshad/dump/FindEven.c
这里dump & temp 是子目录,每个子目录包含一些文件。首先,我认为由于用户权限,它可能无法遍历子目录(因为它们是由 root 创建和拥有的),但正如您在第一个程序的输出中看到的那样,情况并非如此。所以我无法找出这两个程序的问题。
P.S.: 在前两行程序打印目录和文件后的输出中。
你真的应该检查 opendir()
中的错误。如果失败,它将 return NULL
,然后下一个 readdir()
将出现段错误。
这可能就足够了:
dir = opendir(name);
if (!dir)
{
perror(name);
return;
}
您正在将每个文件名连接到由此传递的名称上:
strcat(name,ent->d_name);
但未撤消它为下一个文件做好准备。所以字符串变得越来越长,直到它打破它分配的大小。
您应该在本地构建另一个字符串,以保留传递的名称。
char localname[100];
strcpy(localname, name);
strcat(localname,"/");
strcat(localname,ent->d_name);
traverseDirectory(localname);
但错误保护比我用过的更好。
我试图搜索这个问题,但没有找到满意的答案。所以这是我的问题:
我正在使用以下代码变体遍历目录:
我.
#include<stdio.h>
#include<sys/types.h>
#include<dirent.h>
#include<string.h>
#include<sys/stat.h>
void traverseDirectory(char name[100]){
DIR* dir;
struct dirent *ent;
struct stat states;
dir = opendir(name);
while((ent=readdir(dir)) != NULL){
stat(ent->d_name,&states);
if(!strcmp(".", ent->d_name) || !strcmp("..", ent->d_name)){
continue;
}
else{
printf("%s/%s\n",name,ent->d_name);
if(S_ISDIR(states.st_mode)){
strcat(name,"/");
strcat(name,ent->d_name);
traverseDirectory(name);
}
}
}
closedir(dir);
}
int main(){
char path[100];
printf("Enter the path:\n");
scanf("%s",&path);
traverseDirectory(path);
}
这个遍历子目录,但在遍历第一个子目录并打印其文件后出现分段错误。
输出为:
Enter the path:
/home/harshad/dump
/home/harshad/dump/TraverseDirectory.c
/home/harshad/dump/temp
/home/harshad/dump/temp/temptest.txt
Segmentation fault
II.
#include<stdio.h>
#include<sys/types.h>
#include<dirent.h>
#include<string.h>
#include<sys/stat.h>
void traverseDirectory(char name[100]){
DIR* dir;
struct dirent *ent;
struct stat states;
dir = opendir(name);
while((ent=readdir(dir)) != NULL){
stat(ent->d_name,&states);
if(!strcmp(".", ent->d_name) || !strcmp("..", ent->d_name)){
continue;
}
else{
printf("%s/%s\n",name,ent->d_name);
if(S_ISDIR(ent->d_type & DT_DIR)){
strcat(name,"/");
strcat(name,ent->d_name);
traverseDirectory(name);
}
}
}
closedir(dir);
}
int main(){
char path[100];
printf("Enter the path:\n");
scanf("%s",&path);
traverseDirectory(path);
}
这个打印给定目录中的所有文件和子目录,但不遍历子目录。它的输出是:
Enter the path:
/home/harshad/dump
/home/harshad/dump/TraverseDirectory.c
/home/harshad/dump/temp
/home/harshad/dump/TraverseDirectory1.out
/home/harshad/dump/dump
/home/harshad/dump/test.txt
/home/harshad/dump/SortMarks.c
/home/harshad/dump/TraverseDirectory.out
/home/harshad/dump/TraverseDirectoryTemp.out
/home/harshad/dump/TraverseDirectory1.c
/home/harshad/dump/TraverseDirectoryTemp.c
/home/harshad/dump/FindEven.c
这里dump & temp 是子目录,每个子目录包含一些文件。首先,我认为由于用户权限,它可能无法遍历子目录(因为它们是由 root 创建和拥有的),但正如您在第一个程序的输出中看到的那样,情况并非如此。所以我无法找出这两个程序的问题。 P.S.: 在前两行程序打印目录和文件后的输出中。
你真的应该检查 opendir()
中的错误。如果失败,它将 return NULL
,然后下一个 readdir()
将出现段错误。
这可能就足够了:
dir = opendir(name);
if (!dir)
{
perror(name);
return;
}
您正在将每个文件名连接到由此传递的名称上:
strcat(name,ent->d_name);
但未撤消它为下一个文件做好准备。所以字符串变得越来越长,直到它打破它分配的大小。
您应该在本地构建另一个字符串,以保留传递的名称。
char localname[100];
strcpy(localname, name);
strcat(localname,"/");
strcat(localname,ent->d_name);
traverseDirectory(localname);
但错误保护比我用过的更好。