如何获取给定名称和父目录句柄或 inode 的文件大小?
How to get file size given name and parent directory handle or inode?
我正在编写一个小实用程序来递归扫描目录树并记录树结构以及文件名和大小。 (越快越好)
也许我把自己逼到了一个角落。我可以使用 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;
}
一旦 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;
}
我正在编写一个小实用程序来递归扫描目录树并记录树结构以及文件名和大小。 (越快越好)
也许我把自己逼到了一个角落。我可以使用 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;
}
一旦 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;
}