【问题标题】:How to get file size given name and parent directory handle or inode?如何获取给定名称和父目录句柄或inode的文件大小?
【发布时间】:2018-01-12 22:38:01
【问题描述】:

我正在编写一个小实用程序来递归地扫描目录树并记录带有文件名和大小的树结构。 (尽可能快)

也许我已经把自己编码到了一个角落。我可以使用 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;
}

【问题讨论】:

  • 你期望调用的函数statat实际上是fstatat。在符号链接的情况下,它需要一个额外的标志参数来确定它是否具有类似lstat 的行为。 POSIX specLinux man page
  • 天哪。就在那里!我想我在查看我的 goto 网页手册页 fstat 时忽略了它。

标签: c stat dirent.h fstat


【解决方案1】:

一旦 Wumpus Q. Wumbley 在 cmets 中给出了答案,结果证明这很容易。 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;
}

【讨论】:

  • 出于好奇,您是否发现您的系统在fstatat(和openat + fdopendir 我想)和传递完整路径名之间有任何性能差异?几年前,我对自己进行了一些修补,希望缩短一些周期,并回想起对结果有点不知所措。
猜你喜欢
  • 2012-01-02
  • 2017-04-14
  • 2012-01-23
  • 2011-04-18
  • 2011-06-04
  • 2011-01-10
  • 1970-01-01
  • 2011-06-16
  • 2011-09-04
相关资源
最近更新 更多