2

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

4

2 回答 2

6

您无法将 a 转换为struct dirent *FILE *因为第一个仅与一个目录条目相关,无论它是文件、子目录还是其他东西,无论您是否有权访问该文件等等,而您只能有一个FILE *你打开的文件。还。没有办法通过它的inode打开文件,

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

 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不是绝对路径,则chdir()在调用opendir( dirname )openfile( .... )

于 2014-03-05T16:25:12.693 回答
-1

您不应该将 a 转换struct dirent *为 a FILE *。如果想要 a 对应的文件名struct dirent,可以从这个结构中获取。

例如,如果您有

struct dirent *dp = readdir(DIR directory);

那么这个目录条目的文件名是dp->d_name.

有关详细信息,请参阅readdir(3)

于 2014-03-05T16:24:57.327 回答