0

ファイルのツリー構造を検索するためのこの再帰関数があります。そして、各ファイルのパラメーター (タイプ、所有者、グループ、権限、作成日、最終変更日など) を見つける必要があります。

void search(const char * path)
{
  char newpath[PATH_SIZE + 1];

  DIR * dp;
  struct dirent * ep;

  dp = opendir(path);
  if (dp == NULL)
    return;

  while ((ep = readdir(dp)) != NULL)
  {
    if (strcmp(".",  ep->d_name) == 0 ||
        strcmp("..", ep->d_name) == 0)
    {
      continue;
    }

    printf("%s/%s\n", path, ep->d_name);


    if ((ep->d_type & DT_DIR) == DT_DIR)
    {
      if (strlen(path) + strlen(ep->d_name) + 1 <= PATH_SIZE)
      {
        sprintf(newpath, "%s/%s", path, ep->d_name);
        search(newpath);
      }
    }
  }

  closedir(dp);

  return;
}

ファイルのタイプ (ep-> d_type) しか知りません。

4

2 に答える 2

1

@gustaf r の答えは絶対に正しいです。しかし、MANページにもあるポイントをもう1つ追加したいと思います。

These functions return information about a file.   No  permissions  are
   required  on  the  file itself, but—in the case of stat() and lstat() —
   execute (search) permission is required on all of  the  directories  in
   path that lead to the file.

したがって、作業中のディレクトリには適切な権限が必要です。

于 2013-01-12T10:54:17.990 に答える
1

stat() 関数によって:

マニュアル:man 2 stat

プロトタイプ:

   int stat(const char *path, struct stat *buf);
   int fstat(int fd, struct stat *buf);
   int lstat(const char *path, struct stat *buf);

ここで、stat 構造体は次のように定義されます。

   struct stat {
       dev_t     st_dev;     /* ID of device containing file */
       ino_t     st_ino;     /* inode number */
       mode_t    st_mode;    /* protection */
       nlink_t   st_nlink;   /* number of hard links */
       uid_t     st_uid;     /* user ID of owner */
       gid_t     st_gid;     /* group ID of owner */
       dev_t     st_rdev;    /* device ID (if special file) */
       off_t     st_size;    /* total size, in bytes */
       blksize_t st_blksize; /* blocksize for file system I/O */
       blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
       time_t    st_atime;   /* time of last access */
       time_t    st_mtime;   /* time of last modification */
       time_t    st_ctime;   /* time of last status change */
   };
于 2013-01-12T10:48:47.983 に答える