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