给定目录的路径如何检查某个文件是否存在于其中?

时间:2016-02-20 20:41:38

标签: c file path server

所以我给了/path/to/a/directory/并且应该检查其中是否存在index.php。如果是,我应该返回/path/to/a/directory/index.php。如果index.html存在,我应该返回,否则NULL 目前我正在使用fopen(file, 'r'),但我认为它没有按照我的意愿去做。我一直在研究函数stat()scandir(),但我对如何使用这些函数毫无头绪......(即使在一遍又一遍地阅读MAN页面之后^^)

/**
 * Checks, in order, whether index.php or index.html exists inside of path.
 * Returns path to first match if so, else NULL.
 */
char* indexes(const char* path)
{
    char* newPath = malloc(strlen(path) + strlen("/index.html") + 1);
    strcpy(newPath, path);

    if(access( path, F_OK ) == 0 )
    {
        printf("access to path SUCCESS\n");
        if( fopen( "index.php", "r" ))
        {
            strcat( newPath, "index.php" );
        }
        else if( fopen( "index.html", "r"))
        {
            strcat( newPath, "index.html" );
        }
        else
        {
            return NULL;
        }
    }
    else
    {
        return NULL;
    }
    return newPath;
}

我在这里看到的主要问题是我不认为我的函数会在所需路径中查找fopen()的文件。他们究竟在哪里寻找文件?我的根文件夹?

任何输入都会受到极大关注。

2 个答案:

答案 0 :(得分:2)

opendir怎么样:

char* indexes(const char* path)
{
    DIR *dir;
    struct dirent *entry;
    char* newPath = NULL;

    dir = opendir(path);
    while ((entry = readdir(dir)) != NULL) {
        if (!strcmp(entry->d_name, "index.php") || !strcmp(entry->d_name, "index.html"))
        newPath = malloc(strlen(path) + strlen(entry->d_name) + 2);
        sprintf(newPath, "%s/%s", path, entry->d_name);
        break;
    }
    closedir(dir);
    return newPath ;
}

在这里打开目录条目并使用readdir进行扫描,返回标识内部每个文件的结构(有关详细信息,请参阅opendirreaddir的手册页。)
不鼓励使用fopen,因为对于尝试打开每个文件的系统来说很重要,当目录包含数千或更多文件时,它将非常慢。

答案 1 :(得分:1)

你的基本想法被认为是好的。在调用fopen()之前,为每个文件构造路径/文件名。为最长元素分配内存并将其用于例如sprintf()以获取路径。当fopen()成功时,您可以返回该指针,如果不是,请不要忘记释放()内存。