我一直在尝试在 minix 中实现一个搜索功能,它将在当前或子目录中查找文件并打印路径。到目前为止,我的代码编译成功,但由于某种原因它只返回几个奇怪的 ascii 字符,知道我做错了什么吗?
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
_PROTOTYPE(int main, (int argc, char **argv));
_PROTOTYPE(char *find_file, (char *name, char *directory));
int main(argc, argv)
int argc;
char **argv;
{
char *path = find_file(argv[0], "./");
if (strcmp(path, "") == 0) {
printf("file could not be found.");
} else {
printf("File found in: %s\n", path);
}
return(0);
}
char *find_file(name, directory)
char *name;
char *directory;
{
DIR *d;
struct dirent *e;
struct stat s;
char *dr;
char *res;
char *result;
d = opendir(directory);
if (d != NULL) {
while (e = readdir(d)) {
if (e->d_name == name)
return name;
}
}
closedir(d);
d = opendir(directory);
if (d != NULL) {
while (e = readdir(d)) {
stat(e->d_name, &s);
if (s.st_mode & S_IFDIR) {
dr = malloc(strlen(directory) + strlen(e->d_name) + 2);
strcpy(dr, directory);
strcat(dr, e->d_name);
strcat(dr, "/");
res = find_file(name, dr));
if (strcmp(res, "") != 0) {
strcpy(result, e->d_name);
strcat(result, "/");
strcat(result, res);
return result;
}
}
}
}
closedir(d);
return "";
}
所以我首先检查文件是否在当前目录中,然后再进入子文件夹,这就是我打开和关闭目录两次的原因。我唯一怀疑可能是非正统的事情是直接使用 malloc 并声明一个固定的数量,这是不可以吗?感谢您的帮助<3
编辑:所以我尝试使用 malloc 与字符串的大小而不是设置的数量但没有改变,这是一个截图:
EDIT2:由于建议更新了我的代码,但仍然无法 100% 工作,因为它正在使用父文件夹或类似的奇怪东西,如果我设法让它完美工作,将发布解决方案(y)
EDIT3:我已经设法让它工作(在某种程度上)它可以完美地工作,但在某些情况下它找不到现有文件,不知道原因并且太累了,无法确定为什么^_^这里是对于将来会寻找类似解决方案的任何其他人的最终工作代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
_PROTOTYPE(int main, (int argc, char **argv));
_PROTOTYPE(char *find_file, (char *name, char *directory));
int main(argc, argv)
int argc;
char **argv;
{
char *path = find_file(argv[1], "./");
if (strcmp(path, "") == 0) {
printf("file could not be found.\n");
} else {
printf("File found in: %s\n", path);
}
return(0);
}
char *find_file(name, directory)
char *name;
char *directory;
{
DIR *d;
struct dirent *e;
struct stat s;
char *dr;
char *res;
char *result;
d = opendir(directory);
if (d != NULL) {
while (e = readdir(d)) {
if (strcmp(e->d_name, name) == 0)
return e->d_name;
}
}
closedir(d);
d = opendir(directory);
if (d != NULL) {
while (e = readdir(d)) {
stat(e->d_name, &s);
if (strcmp(e->d_name, ".") != 0 && strcmp(e->d_name, "..") != 0) {
if (s.st_mode & S_IFDIR) != 0) {
dr = malloc(strlen(directory) + strlen(e->d_name) + 2);
strcpy(dr, directory);
strcat(dr, e->d_name);
strcat(dr, "/");
res = find_file(name, dr));
if (strcmp(res, "") != 0) {
result = malloc(strlen(e->d_name) + strlen(res) + 2);
strcpy(result, e->d_name);
strcat(result, "/");
strcat(result, res);
return result;
}
}
}
}
}
closedir(d);
return "";
}
由于某种原因,文件名是在 argv 1而不是 argv[0] 中传递的,这很奇怪,因为我实现了另一个通过 argv[0] 传递文件名的函数... Minix¯| (ツ) /¯