2009-11-27 2 views
0

Я делаю сервер HTTP, и когда я получаю путь к файлу они просят открыть его следующим образом:Есть ли простой способ узнать, открыл ли файловый файл каталог вместо файла?

returned_file = fopen(path, "r"); 

это (вопреки тому, что я думаю) удастся, даже если путь является каталог. Есть ли простой способ проверить, является ли поток return_file каталогом, а не файлом?

ответ

0

Можете ли вы проверить, указывает ли путь на каталог до, вы вызываете fopen?

+0

(Может быть, это должно было быть комментарием.) – Wevah

+0

, конечно, я мог бы, но это в основном то, что я спрашиваю, как я бы это проверил? – adhanlon

+0

Возможно, я не понял этого, но я не могу просто проверить путь, увидев, что «/» находится в конце, чтобы узнать, является ли это каталогом, потому что это не является обязательным условием для '/' быть в конце, чтобы он был каталогом – adhanlon

4

Вы можете использовать fstat в файловом дескрипторе, возвращенном fopen.

Edit: Вот и пример программы:

#include <sys/stat.h> 
#include <stdio.h> 

void printISDir(FILE* fp, char const * name) { 
    int fdes = fileno(fp) ; 
    struct stat fileInfo ; 
    fstat(fdes, &fileInfo) ; 
    if (S_ISDIR(fileInfo.st_mode)) { 
    printf("%s: I'm a dir!\n", name) ; 
    } else { 
    printf("%s: I'm a file!\n", name) ; 
    } 

} 

int main(int argc, char** argv) { 
    char const * directoryName = "/etc" ; 
    char const * fileName = "/etc/hosts" ; 

    FILE* dirFp = fopen(directoryName, "r") ; 
    FILE* fileFp = fopen(fileName, "r") ; 
    printISDir(dirFp, directoryName) ; 
    printISDir(fileFp, fileName) ; 
    fclose(dirFp) ; 
    fclose(fileFp) ; 

    return 0 ; 
} 
+0

Это лучше. – Wevah

0

Используйте стат() на имя файла, прежде чем открыть его, или fstat() дескриптор файла fileno (returned_file).

+0

Я попытался использовать stat, и он возвращает stat структуры, теперь используя эту структуру, как определить, является ли это каталогом? – adhanlon

+0

Не использовать stat, использовать fstat. Вам всегда нужно проверять после того, как вы открыли его, чтобы избежать условия гонки, когда он был файлом, когда вы его проверили, но был удален и превращен в каталог до того, как ваше открытие будет завершено. – janm

4

Разрабатывая другие ответы, вы можете вызвать fstat в дескрипторе возвращаемого файла и проверить st_mode на бит S_IFDIR. S_ISDIR помощник макрос полезен:

#include <sys/stat.h> 

...

FILE* f = fopen(path, "r"); 

    struct stat buf; 
    if (fstat(fileno(f), &buf) == -1) { 
    perror("fstat"); 
    } else { 
    if (S_ISDIR(buf.st_mode)) { 
     printf("is directory\n"); 
    } else { 
     printf("not directory\n"); 
    } 
    } 
+0

S_ISDIR (buf.st_mode) от также может быть использован – DanM

Смежные вопросы