C中读取目录的问题 [英] Problem reading directories in C

查看:176
本文介绍了C中读取目录的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个简单的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆