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

C 如何获得给定名称和父目录句柄或inode的文件大小?,c,stat,dirent.h,fstat,C,Stat,Dirent.h,Fstat,我正在编写一个小实用程序来递归地扫描目录树,并用文件名和大小记录树结构。(尽可能快) 也许我把自己藏在一个角落里了。我可以使用readdir(3)获取目录的内容,并分别处理常规文件和目录 除了调用openat()、fstat()、close()之外,我不知道如何获得常规文件的文件大小 在处理目录条目时,有没有办法更直接地获取文件大小?可能来自inode编号? 我希望它会存在:stat(int parentDirFD,const char*filename),因为我只有文件名,而没有文件路径 我的

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

也许我把自己藏在一个角落里了。我可以使用readdir(3)获取目录的内容,并分别处理常规文件和目录

除了调用
openat()、fstat()、close()
之外,我不知道如何获得常规文件的文件大小

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

我希望它会存在:
stat(int parentDirFD,const char*filename)
,因为我只有文件名,而没有文件路径

我的内核中似乎没有O_路径支持

#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;
}
#包括
#包括
#包括
DIR*p_DIR=。。。;
int dir_fd=dirfd(p_dir);
大小\u t获取\u文件大小(仅限常量字符*文件名\u、int dir\u fd、dir*pdir)
{
////这让我觉得太贵了:
int fd=openat(dir\u fd,仅文件名,O\u RDONLY);
结构统计某人;
财政司司长(财务司司长及财务司司长);
大小文件大小=sb.st\U大小;
关闭(fd);
//////
返回文件大小;
}

一旦Wumpus Q.Wumbley在评论中给出了答案,结果证明这很容易。

#包括
#包括
#包括
DIR*p_DIR=。。。;
int dir_fd=dirfd(p_dir);
大小\u t获取\u文件大小(仅限常量字符*文件名,int dir\u fd)
{
结构统计某人;
int fstatat_flags=0;//|AT_SYMLINK_NOFOLLOW
int stat_res=fstatat(dir_fd,仅文件名,&sb,fstatat_标志);
大小文件大小=sb.st\U大小;
返回文件大小;
}

一旦Wumpus Q.Wumbley在评论中给出了答案,结果证明这很容易。

#包括
#包括
#包括
DIR*p_DIR=。。。;
int dir_fd=dirfd(p_dir);
大小\u t获取\u文件大小(仅限常量字符*文件名,int dir\u fd)
{
结构统计某人;
int fstatat_flags=0;//|AT_SYMLINK_NOFOLLOW
int stat_res=fstatat(dir_fd,仅文件名,&sb,fstatat_标志);
大小文件大小=sb.st\U大小;
返回文件大小;
}

您希望调用的函数
stat
实际上被称为
fstatat
。在符号链接的情况下,它需要一个额外的flag参数来确定它是否具有类似于lstat的行为。天哪。就在那里!我想我只是在查看我的goto web手册页时忽略了它。您希望调用的函数
stat
实际上被称为
fstatat
。在符号链接的情况下,它需要一个额外的flag参数来确定它是否具有类似于lstat的行为。天哪。就在那里!我想我只是在查看我的goto web手册页时忽略了它。出于好奇,您是否发现您的系统在
fstatat
(和
openat
+
fdopendir
我想)和传递完整路径名之间有任何性能差异?几年前,我对自己做了一点修补,希望减少一些周期,并回忆起对结果有点不满意。出于好奇,您是否发现
fstatat
(和
openat
+
fdopendir
)和传递完整路径名之间的系统性能差异?几年前,我对自己做了一些修补,希望能减少一些周期,并回忆起对结果有点不满意。
#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;
}