如何检查文件是否在C中的特定目录或其子目录中

时间:2018-12-26 17:28:36

标签: c subdirectory

我正在构建自己的外壳程序,我想知道:如何知道命令存储在目录“ / bin”及其子目录中。 我想实现一个char * path_to_command(char * commandname)函数,该函数返回参数中给定命令的路径。

我一直在寻找确定特定文件是否在目录中的函数(例如fopen或access)。但是这些功能只是告诉我们文件是否仅位于目录中。 我正在考虑使用fopen的递归函数,在该函数中我将不得不大量使用strcat。 我相信有更好的解决方案。

英语不是我的母语,如果有错误,我非常抱歉。 谢谢。

3 个答案:

答案 0 :(得分:3)

不要自己编写递归函数,而是使用标准的nftw

  

NAME

     

nftw-遍历文件树

     

简介

#include <ftw.h>

int nftw(const char *path, int (*fn)(const char *,
         const struct stat *, int, struct FTW *), int fd_limit, int flags);
     

描述

     

nftw()函数应递归地下降目录层次结构   扎根于路径。

但是,对于标准外壳程序,无需递归搜索(最糟糕的是,这对于任何用户来说都是很奇怪的),您只需要搜索PATH环境变量中提到的目录即可。

答案 1 :(得分:0)

您需要查看目录内容,并查看功能 opendir / readdir / closedir #include <dirent.h>)< / p>

{编辑添加}

请注意,当您扫描目录的内容时,您将到达目录“”。和“ ..”,请不要递归进入它们,因为“。”是当前目录,而“ ..”是上层目录(“ /”除外,其中“ ..”也是“ /”)

答案 2 :(得分:0)

您不仅可以使用opendir(3)readdir(3)closedir,而且还可能想构造字符串中的某些文件路径(使用{ {1}}或asprintf)并在其上使用stat(2)access(2)(因为snprintf返回目录条目,您将其目录readdir与路径结合使用)包含目录)。

您也可以使用nftw(3)

但是,在外壳中,您只想迭代PATH variable的组件,并将程序名称附加到每个组件上。为此,不需要递归下降。还有execvp(3)