C中读取目录的问题 [英] Problem reading directories in C
问题描述
stat
函数失败。这是我的节目: #define _POSIX_SOURCE 1
#include< stdio.h>
#include< stdlib.h>
#include< unistd.h>
#include< dirent.h>
#include< string.h>
#include< sys / stat.h>
#include< sys / types.h>
void display_directory(char * path){
DIR * directory = opendir(path);
if(directory == NULL){
printf(opendir failure for%s\\\
,path);
exit(1);
}
struct dirent * dirent;
struct stat stat_info;
while((dirent = readdir(directory))!= NULL){
printf([%s] \\\
,dirent-> d_name);
if(stat(dirent - > d_name,& stat_info)== -1){
printf(%s\\\
的readdir错误,dirent-> d_name);
exit(1);
}
if(S_ISREG(stat_info.st_mode)){
printf(File:%s \\\
,dirent - > d_name);
}
if(S_ISDIR(stat_info.st_mode)){
if(strncmp(dirent-> d_name,..,2)){
printf :%s\\\
,dirent-> d_name);
display_directory(dirent-> d_name);
}
}
}
closedir(directory);
}
int main(int argc,char * argv []){
char * path;
if(argc> 1){
path = argv [1];
} else {
path =。;
}
display_directory(path);
return EXIT_SUCCESS;
}
例如,如果在我的目录A中,我有a1,a2,a3和 ..
,它首先读取 ..
目录,当它读取目录a1时, stat
函数失败。
有人可以告诉我我的代码不正确。
我包含< errno.h>
许多建议和运行程序后,我有错误太多的打开文件
。
#define _POSIX_SOURCE 1
#include< stdio.h>
#include< stdlib.h>
#include< unistd.h>
#include< dirent.h>
#include< string.h>
#include< errno.h>
#include< sys / stat.h>
#include< sys / types.h>
void display_directory(char * path){
DIR * directory = opendir(path);
if(directory == NULL){
printf(opendir failure for%s - >%s\\\
,path,strerror(errno));
exit(1);
}
struct dirent * dirent;
struct stat stat_info;
while((dirent = readdir(directory))!= NULL){
printf([%s] \\\
,dirent-> d_name);
if(stat(dirent-> d_name,& stat_info)){
printf(%s --->%s\\\
的readdir错误,dirent-> d_name,字符串错误(错误));
继续;
}
if(S_ISREG(stat_info.st_mode)){
printf(Fichier:%s \\\
,dirent-> d_name);
}
if(S_ISDIR(stat_info.st_mode)){
if(strncmp(dirent-> d_name,..,2)){
printf :%s\\\
,dirent-> d_name);
display_directory(dirent-> d_name);
}
}
}
closedir(directory);
}
int main(int argc,char * argv []){
char * path;
if(argc> 2){
fprintf(stderr,Usage:%s [directory] \\\
,argv [0]);
exit(1);
}
path = argv [1];
display_directory(path);
return EXIT_SUCCESS;
}
程序的输出:
[...]
[mykill.c]
mykill.c --->的readdir错误没有这样的文件或目录
[。]
目录:。
[..]
[。]
目录:。
[..]
[。]
目录:。
[..]
...
...
目录:。
opendir失败。 - >打开文件太多
mykill.c是作为参数传递的目录中的文件。 / p>
if(S_ISDIR(stat_info.st_mode)){
if(! strcmp(dirent-> d_name,。))继续;
if(!strcmp(dirent-> d_name,..))继续;
printf(Directory:%s\\\
,dirent-> d_name);
display_directory(dirent-> d_name);
}
I am writing a simple C program that receives a directory as an argument and displays the files in this directory and also his subdirectories. I wrote a "recursive" function for doing that. But for an unknown reason, my program fails at the stat
function. Here is my program :
#define _POSIX_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
void display_directory(char* path){
DIR* directory = opendir(path);
if( directory == NULL){
printf("opendir failure for %s\n", path);
exit(1);
}
struct dirent* dirent;
struct stat stat_info;
while((dirent = readdir(directory)) != NULL){
printf("[%s]\n", dirent->d_name);
if(stat(dirent -> d_name, &stat_info) == -1){
printf("readdir error for %s\n", dirent->d_name);
exit(1);
}
if(S_ISREG(stat_info.st_mode)){
printf("File: %s \n", dirent -> d_name);
}
if(S_ISDIR(stat_info.st_mode)){
if(strncmp(dirent->d_name, "..",2)){
printf("Directory : %s\n", dirent->d_name);
display_directory(dirent->d_name);
}
}
}
closedir(directory);
}
int main(int argc, char* argv[]){
char* path;
if(argc > 1){
path = argv[1];
} else {
path = ".";
}
display_directory(path);
return EXIT_SUCCESS;
}
For instance, if in my directory A, I have a1, a2, a3 and ..
, it reads first the ..
directory, and when it reads the directory a1, the stat
function fails.
Can someone tells me what is not correct with my code.
[EDIT] I included <errno.h>
as many of you suggest and after running the program, I have the error Too many open files
.
#define _POSIX_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
void display_directory(char* path){
DIR* directory = opendir(path);
if( directory == NULL){
printf("opendir failure for %s --> %s\n", path, strerror(errno));
exit(1);
}
struct dirent* dirent;
struct stat stat_info;
while((dirent = readdir(directory)) != NULL){
printf("[%s]\n", dirent->d_name);
if(stat(dirent->d_name, &stat_info)){
printf("readdir error for %s ---> %s\n", dirent->d_name, strerror(errno));
continue;
}
if(S_ISREG(stat_info.st_mode)){
printf("Fichier : %s \n", dirent->d_name);
}
if(S_ISDIR(stat_info.st_mode)){
if(strncmp(dirent->d_name, "..",2)){
printf("Directory : %s\n", dirent->d_name);
display_directory(dirent->d_name);
}
}
}
closedir(directory);
}
int main(int argc, char* argv[]){
char* path;
if (argc > 2) {
fprintf(stderr, "Usage: %s [directory]\n", argv[0]);
exit(1);
}
path = argv[1];
display_directory(path);
return EXIT_SUCCESS;
}
The output of the program :
[..]
[mykill.c]
readdir error for mykill.c ---> No such file or directory
[.]
Directory : .
[..]
[.]
Directory : .
[..]
[.]
Directory : .
[..]
...
...
Directory : .
opendir failure for . --> Too many open files
mykill.c is a file in the directory that was passed as an argument.
if(S_ISDIR(stat_info.st_mode)){
if( !strcmp(dirent->d_name, ".")) continue;
if( !strcmp(dirent->d_name, "..")) continue;
printf("Directory : %s\n", dirent->d_name);
display_directory(dirent->d_name);
}
这篇关于C中读取目录的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!