C 将 struct dirent * 转换为 FILE *

标签 c file-io filesystems dirent.h

我正在用 C 语言编写一个文件浏览器,它使用相当于 ls 和 cd 的功能来让用户导航文件系统并选择文件。一切都运行良好 - 我可以让用户选择一个代表他们想要选择的文件的目录条目的 struct dirent * 。但是,我想在我的程序中打开这个文件,而我知道如何做到这一点的唯一方法是通过 fopen(FILE* fptr) 。有没有办法可以将 struct dirent * 转换为 FILE*struct dirent 有一个属性 ino_t d_fileno,它指的是“文件序列号” - 这与文件描述符相同吗?我可以使用该文件描述符打开 FILE* 吗?

最佳答案

您无法将 struct dirent * '转换' 为 FILE * 因为第一个仅与一个目录条目相关,无论它是文件、子文件目录或其他内容,无论您是否具有文件等的访问权限,而您只能拥有已打开的文件的 FILE * 。还。无法通过文件的 inode 打开文件,

可以做的是根据您在opendir()dir->d_name中使用的目录名称构建文件的路径名> 和 fopen() 路径名:

 FILE *openfile( const char *dirname, struct dirent *dir, const char *mode )
 {
       char pathname[1024];   /* should alwys be big enough */
       FILE *fp;

       sprintf( pathname, "%s/%s", dirname, dir->d_name );
       fp = fopen( pathname, mode );
       return fp;
 }

请注意,我假设,如果 dirname 不是绝对路径,则在调用 opendir( dirname) 之间不会执行任何 chdir() )openfile( .... )

关于C 将 struct dirent * 转换为 FILE *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22202712/

相关文章:

c - 指针为本地时出现段错误

c++ - 可以构建自定义 node.js 插件但不能包含

c - 字符数组到链表 - 使用数组中的地址

filesystems - LBA和集群

c++ - 创建一个 "mountable"文件系统,从哪里开始?

filesystems - 内部和外部碎片

c - 在具有重复值的未排序数组中查找缺失的数字

node.js - 为 OS X 构建重复数据删除应用程序,我应该使用什么/如何作为文件的哈希

linux - 在 Linux 中测试 IO 性能

java - 你见过 Java File close() 抛出异常吗?