如何获取给定名称和父目录句柄或inode的文件大小?

时间:2017-08-04 22:07:45

标签: c stat dirent.h fstat

我正在编写一个小实用程序,以递归方式扫描目录树,并使用文件名和大小记录树结构。 (尽快)

也许我已将自己编入角落。我可以使用readdir(3)获取目录的内容,并单独处理常规文件和目录。

除了openat(), fstat(), close()来电之外,我没有看到如何获取常规文件的文件大小。

有没有办法在我处理目录条目时更直接地获取文件大小?也许来自inode编号?

我原以为这会存在:statat(int parentDirFD, const char * filename)因为我只有文件名,而不是文件路径。

我的内核中似乎没有O_PATH支持。

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

DIR* p_dir = ...;

int dir_fd = dirfd(p_dir);


size_t get_file_size(const char * filename_only, int dir_fd, DIR* pdir )
{
  //// this just strikes me as overly expensive:
  int fd = openat(dir_fd, filename_only, O_RDONLY );
  struct stat sb;
  fstat( fd, &sb );
  size_t file_size = sb.st_size;
  close(fd);
  //////

  return file_size;
}

1 个答案:

答案 0 :(得分:0)

一旦Wumpus Q. Wumbley在评论中给出了答案,事实证明这很容易。 fstatat()

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

DIR* p_dir = ...;

int dir_fd = dirfd(p_dir);


size_t get_file_size(const char * filename_only, int dir_fd )
{
  struct stat sb;
  int fstatat_flags = 0; //| AT_SYMLINK_NOFOLLOW
  int stat_res = fstatat( dir_fd, filename_only, &sb, fstatat_flags );
  size_t file_size = sb.st_size;

  return file_size;
}