我正在用C编写一个文件浏览器,它使用ls和cd的等价物来让用户浏览文件系统并选择一个文件。一切运作良好 - 我可以得到用户选择代表他们想要选择的文件的目录条目的struct dirent *
。但是,我想在我的程序中打开这个文件,我知道如何做的唯一方法是通过fopen(FILE* fptr)
。我有办法将struct dirent *
转换为FILE*
吗? struct dirent
有一个属性ino_t d_fileno
,它引用“文件序列号” - 是否与文件描述符相同?我可以使用该文件描述符打开FILE*
吗?
答案 0 :(得分:4)
你无法将struct dirent *
“转换”为FILE *
,因为第一个与一个目录条目相关,无论它是文件,子目录还是别的,无论你是否拥有对文件的访问权限等等,而您只能为已打开的文件设置FILE *
。也。没有办法通过它的inode来打开文件,
您可以做的是,正在您使用opendir()
和dir->d_name
以及fopen()
路径名中使用的目录名称构建文件的路径名: / p>
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( .... )
答案 1 :(得分:0)
您不应将struct dirent *
转换为FILE *
。如果您希望文件名对应struct dirent
,则可以从此结构中获取。
例如,如果你有
struct dirent *dp = readdir(DIR directory);
然后此目录条目的文件名为dp->d_name
。
有关详细信息,请参阅readdir(3)
。