【问题标题】:Searching a folder presents everything inside and outside搜索文件夹会显示内部和外部的所有内容
【发布时间】:2012-06-18 21:03:40
【问题描述】:

我正在从 Ubuntu 的终端运行我的代码,以搜索特定文件,但搜索会在该文件夹内部以及外部生成文件夹和文件。代码如下:

(编译和运行)

#include <stdio.h>     // For perror
#include <stdlib.h>
#include <sys/types.h> // For stat, opendir, readdir
#include <sys/stat.h>  // For stat
#include <unistd.h>    // For stat
#include <dirent.h>    // For opendir, readdir


int displayAllFiles(char * directory)
{

    DIR *dir;
    struct dirent *ent;
        dir = opendir (directory);
    if (dir != NULL) {

      /* print all the files and directories within directory */
      while ((ent = readdir (dir)) != NULL) {
        printf ("%s\n", ent->d_name);
      }
      closedir (dir);
    } else {
      /* could not open directory */
      perror ("");
      return EXIT_FAILURE;
    }

    return 1;

}



int main(int argc , char * argv[])
{

    DIR *dir;
    struct dirent *entry;
    int result;
    struct stat status;
    char path[PATH_MAX];

    dir = opendir(argv[1]);
    if (!dir)
    {
        perror("opendir");
        exit(1);
    }

    entry = readdir(dir);
    while (entry)
    {
        result = snprintf(path, sizeof(path), "%s", argv[1]);
        snprintf(&path[result], sizeof(path) - result, "/%s", entry->d_name);

        int out = displayAllFiles(path);
        printf("%s", path);

        result = lstat(path, &status);
        if (-1 == result)
        {
            printf("\n");
            perror("stat");
            exit(2);
        }

        if (S_ISLNK(status.st_mode))
        {
            printf("%s", " is a symbolic link");
        }

        printf("\n");

        entry = readdir(dir);
    }


    return(0);
}

我从终端./exer4 check打,那个文件夹,check是父文件夹,然后:

  • insideCheck 在里面 check
  • moreInside 在里面 insideCheck
  • david.txtmoreInside里面

但是,我得到的是:

a@ubuntu:~/Desktop$ ./exer4 check
check
..
Link to workspace2
eclipse 4 linux
fol
.
basherFolder
Link to eclipse
test
eclipse
exer4
doc.txt~
check/..
..
.
insideCheck
check/.
..
moreInside
.
david.txt~
check/insideCheck

出了点问题,我可以看到,但不知道是什么。

感谢您的帮助。

【问题讨论】:

    标签: c file ubuntu io directory


    【解决方案1】:

    这是因为...也在当前目录中列出,其中..表示父目录。

    回答您的评论:将路径与... 进行比较不起作用,因为如您所见,路径是Directory/.Directory/..

    while (entry)
    {
        result = snprintf(path, sizeof(path), "%s", argv[1]);
        snprintf(&path[result], sizeof(path) - result, "/%s", entry->d_name);
    
        char cur_str[80];
        char par_str[80];
        strcpy ( cur_str , argv[1] );
        strcat ( cur_str , "/." );
    
        strcpy ( par_str , argv[1] );
        strcat ( par_str , "/.." );
    
        if (strcmp(path,cur_str) == 0 || strcmp(path ,par_str) == 0) {
         break;
        }
        int out = displayAllFiles(path);
        printf("%s", path);
    
        result = lstat(path, &status);
        if (-1 == result)
        {
            printf("\n");
            perror("stat");
            exit(2);
        }
        if (S_ISLNK(status.st_mode))
        {
            printf("%s", " is a symbolic link");
        }
    
        printf("\n");
    
        entry = readdir(dir);
    }
    

    以上代码有效。 (虽然它会在不是目录的文件上打印“不是目录”错误)。

    【讨论】:

    • 好的,然后添加这个:if (strcmp(path,"..") == 0 || strcmp(path , ".") == 0) break;main 应该可以解决问题吗?
    • 路径不是..,而是Directory/.Directory/..我会用更多细节修改我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多