C将struct dirent *转换为FILE *

时间:2014-03-05 15:57:09

标签: c file-io filesystems dirent.h

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

2 个答案:

答案 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)