所以我给了/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()
的文件。他们究竟在哪里寻找文件?我的根文件夹?
任何输入都会受到极大关注。
答案 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
进行扫描,返回标识内部每个文件的结构(有关详细信息,请参阅opendir
和readdir
的手册页。)
不鼓励使用fopen
,因为对于尝试打开每个文件的系统来说很重要,当目录包含数千或更多文件时,它将非常慢。
答案 1 :(得分:1)
你的基本想法被认为是好的。在调用fopen()之前,为每个文件构造路径/文件名。为最长元素分配内存并将其用于例如sprintf()以获取路径。当fopen()成功时,您可以返回该指针,如果不是,请不要忘记释放()内存。