2009-06-24 1 views

ответ

35

В следующем коде используется функция stat(), а S_ISDIR ('является каталогом') и S_ISREG ('является обычным файлом') для получения информации о файле. Остальное - просто проверка ошибок и достаточно, чтобы составить полную компилируемую программу.

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

int main (int argc, char *argv[]) { 
    int status; 
    struct stat st_buf; 

    // Ensure argument passed. 

    if (argc != 2) { 
     printf ("Usage: progName <fileSpec>\n"); 
     printf ("  where <fileSpec> is the file to check.\n"); 
     return 1; 
    } 

    // Get the status of the file system object. 

    status = stat (argv[1], &st_buf); 
    if (status != 0) { 
     printf ("Error, errno = %d\n", errno); 
     return 1; 
    } 

    // Tell us what it is then exit. 

    if (S_ISREG (st_buf.st_mode)) { 
     printf ("%s is a regular file.\n", argv[1]); 
    } 
    if (S_ISDIR (st_buf.st_mode)) { 
     printf ("%s is a directory.\n", argv[1]); 
    } 

    return 0; 
} 

пробеги Примеры приведены здесь:


pax> vi progName.c ; gcc -o progName progName.c ; ./progName 
Usage: progName 
     where is the file to check. 

pax> ./progName /home 
/home is a directory. 

pax> ./progName .profile 
.profile is a regular file. 

pax> ./progName /no_such_file 
Error, errno = 2 
+0

Ваш код немного громоздкий из-за проверки ошибок. Я предлагаю удалить это и добавить комментарий вроде «проверить на наличие ошибок: файл не существует, недостаточно аргументов». Я думаю, что это сделает ваш ответ немного лучше. –

+3

Я предпочитаю его с проверкой ошибок, поскольку это часто не учитывается в примерах, и люди не всегда знают, как вернуть его. –

+1

Я оставил его, но уточнили в тексте, что представляют собой важные бит. – paxdiablo

9

Используйте системный вызов stat (2). Вы можете использовать макрос S_ISREG или S_ISDIR в поле st_mode, чтобы узнать, является ли данный путь файлом или каталогом. На странице руководства вы узнаете обо всех других полях.

-1

В качестве альтернативы можно использовать систему() функцию с встроенным в командной оболочки "тест".
система возвращает статус выхода последней команды выполняется

 
string test1 = "test -e filename" ; 
if(!system(test1)) 
printf("filename exists") ; 

string test2 = "test -d filename" ; 
if(!system(test2)) 
    printf("filename is a directory") ; 

string test3 = "test -f filename" ; 
if(!system(test3)) 
    printf("filename is a normal file") ; 

, но я боюсь, что это будет работать только на Linux ..

+2

Проблема, если имя файла содержит пробелы, я думаю, вам нужно будет избежать этого. – Paggas

+3

Хотя это будет работать, производительность оставляет желать лучшего. Каждый вызов системы() будет вилкой, а затем вызывать новую оболочку для интерпретации команды. –

5

Что об использовании бустера :: библиотека файловой системы и ее is_directory (константный путь & p)? Это может занять некоторое время, чтобы ознакомиться, но не так много. Это, вероятно, стоит инвестиций, и ваш код не будет специфичным для платформы.