我正在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.txt
位于moreInside
但是,我得到的是:
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
有些事情是错的,我可以看到,但不知道是什么。
感谢您的帮助。
答案 0 :(得分:4)
这是因为.
和..
也列在当前目录中,其中..
表示父级指示。
在回答您的评论时:将路径与.
或..
进行比较无效,因为如您所见,路径为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);
}
以上代码有效。 (虽然它在非目录的文件上打印“Not a directory”错误。)