2010-12-29 25 views
18

何かがファイルかディレクトリかをチェックするプログラムを書いています。これよりも良い方法がありますか?ファイルがディレクトリか単なるファイルかを確認する

#include <stdio.h> 

#include <sys/types.h> 
#include <dirent.h> 
#include <errno.h> 

int isFile(const char* name) 
{ 
    DIR* directory = opendir(name); 

    if(directory != NULL) 
    { 
    closedir(directory); 
    return 0; 
    } 

    if(errno == ENOTDIR) 
    { 
    return 1; 
    } 

    return -1; 
} 

int main(void) 
{ 
    const char* file = "./testFile"; 
    const char* directory = "./"; 

    printf("Is %s a file? %s.\n", file, 
    ((isFile(file) == 1) ? "Yes" : "No")); 

    printf("Is %s a directory? %s.\n", directory, 
    ((isFile(directory) == 0) ? "Yes" : "No")); 

    return 0; 
} 

答えて

36

あなたはstat()関数を呼び出して、あなたのパスポイントかどうかを判断するために、stat構造のst_modeフィールド上S_ISREG()マクロを使用することができます通常のファイル:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 

int is_regular_file(const char *path) 
{ 
    struct stat path_stat; 
    stat(path, &path_stat); 
    return S_ISREG(path_stat.st_mode); 
} 

さらに、レギュラ以外のファイルタイプもありますrディレクトリ(デバイス、パイプ、シンボリックリンク、ソケットなど)を考慮する必要があります。

+4

シンボリックリンクの場合は、シンボリックリンクに従わないため、stat()ではなくlstat()を使用してください。 – Sparky

+3

少なくとも、[ディレクトリが存在するかどうかをチェックする](http://stackoverflow.com/questions/3828192/checking-if-a-directory-exists-in-unix-system-call/) stat() 'と' lstat() 'について議論し、POSIXファイルタイプの完全なセットについて概説します。私はこの質問をその質問に再現したいと思っています。コードは 'stat()'の結果もチェックし、エラーを適切に処理する必要があります。 –

+0

@ジョナサン、その答えは実際に私のものより完全であり、5年前、私の3ヶ月前に投稿されました。とにかく自分の答えが消えるようなことではない。私はあなたが '[c]'タグでMjölnirを使うのを見ているので、一方的に行動する前にコメントしてくれてありがとう。しかし、あなたは最終的に正しいです。あなたがしなければならないことを心配しないでください。 –

4

はい、あります。 statまたはfstat機能

14

をチェックするマクロS_ISDIRを使用します。

int isDirectory(const char *path) { 
    struct stat statbuf; 
    if (stat(path, &statbuf) != 0) 
     return 0; 
    return S_ISDIR(statbuf.st_mode); 
} 
+0

'statbuf'構造体に情報を入力するのを忘れました。 – RedX

+1

これは正常に機能し、stat関数は情報そのものを埋めます。 – ismail

+2

理想的には、コードは 'stat'が動作していることをチェックします:if(stat(path、&statbuf)!= 0)return 0;' - 存在しないオブジェクトはディレクトリではないので、それを 'stat()'する権限があれば、それは存在しないかもしれません(報告されたエラーが許可に関係しているとしても)。 –

1

通常、結果を使用してこのチェックを原子的に実行したいので、stat()は役に立ちません。代わりにopen()ファイルを読み取り専用にしてfstat()を使用してください。それがディレクトリの場合は、fdopendir() を使用して読み取ることができます。または、それを開こうとすると書き始めることができ、それがディレクトリの場合はオープンに失敗します。いくつかのシステム(POSIX 2008、Linux)は、openへの拡張子がO_DIRECTORYであるため、名前がディレクトリでない場合は呼び出しが失敗します。

opendir()の方法は、ディレクトリを必要とする場合にも便利ですが、その後は閉じないでください。あなたは先に進み、それを使うべきです。

関連する問題