1

私はCで次のコードを持っています:

DIR *mydir = opendir("/");
struct dirent *entry = NULL;

while((entry = readdir(mydir)))
{
    printf("%s\n", entry->d_name);
    //printf("%i\n", entry->d_type);
}

closedir(mydir);

それは動作し、その場所にあるファイル/フォルダを正しく表示します。

しかし、それがフォルダなのかファイルなのかを知りたいのです。これどうやってするの?(コードでわかるように)d_typeを試してみましたが、成功しませんでした。

4

4 に答える 4

3

使用stat()

struct stat st;
stat("nodename", &st);
int isDirectory = S_ISDIR(st.st_mode);
于 2012-12-13T21:49:17.853 に答える
1

stat()関数を使用して、統計構造を取得する必要があります。

struct stat s;
if( stat(path,&s) == 0 )
{
    if( s.st_mode & S_IFDIR )
    {
        //it's a directory
    }
    else if( s.st_mode & S_IFREG )
    {
        //it's a file
    }
    else
    {
        //something else
    }
}
else

{
    //error
}
于 2012-12-13T21:50:56.577 に答える
0

次のような組み込みマクロを使用できます。

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

int main(void)
{
  DIR *mydir = opendir(/);
  struct dirent *entry = NULL;
  struct stat buf;

  while((entry = readdir(mydir)))
  {
     printf("%s\n", entry->d_name);
     if (stat(entry, &buf))
     {
        perror("stat");
        exit(-1);
     }
     if ( S_ISDIR(buf.st_mode) ) 
     {
        printf("%s is a directory\n", entry);   
     }
     if ( S_ISREG(buf.st_mode) )
     {
        printf("%s is a regular file\n", entry);
     }
  }

  closedir(mydir);

  return 0;
}

詳細についてman 2 statは、シェルを参照してください。

于 2012-12-13T21:52:17.763 に答える
0

これはシステム固有であり、OSや場合によっては他の設定を知らなければ、完全に確実な答えを出すことはできません。

実際、d_typeは少なくとも一部のシステムでは機能します。あなたのコードは、RedHat Linuxで有用な答えを提供します。ディレクトリの値は4、通常のファイルの値は8、その他のファイルタイプの値は他の値です。これは、opendirの呼び出しで名前/を引用符で囲むタイプミスを修正したものです。

于 2012-12-13T21:54:13.107 に答える