2009-06-24 23 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)システムコールを使用してください。 st_modeフィールドでS_ISREGまたはS_ISDIRマクロを使用して、指定されたパスがファイルかディレクトリかを確認できます。 manページには、他のすべてのフィールドが表示されます。

-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

これはうまくいくが、パフォーマンスには多くの課題が残る。 system()を呼び出すたびに、新しいシェルをforkして実行し、コマンドを解釈します。 –

5

::ファイルシステムライブラリとそのis_directory(constのパス& p)?よく知っているが、それほど多くはない。おそらく投資価値があり、プラットフォーム固有のコードではありません。

関連する問題