Question

I'm writing a file browser in C that uses the equivalent of ls and cd to let the user navigate the filesystem and select a file. It's all working well - I can get as far as the user selecting a struct dirent * that represents the directory entry of the file they want to choose. However, I want to open this file in my program, and the only way I know how to do that is through fopen(FILE* fptr). Is there a way I can convert a struct dirent * to a FILE*? A struct dirent has a property ino_t d_fileno which refers to "the file serial number" - is that the same as a file descriptor? Could I use that file descriptor to open a FILE*?

Was it helpful?

Solution

You can't 'convert' a struct dirent * to FILE * because the first is just related to one directory entry no matter if it's a file, a sub directory or something else, no matter whether you have access rights to the file and so on while you can only have a FILE * for a file you have opened. Also. there's no way to open a file by it's inode,

What you can do, is building the file's pathname from the directory's name as you have used in opendir() and dir->d_name and fopen() that pathname:

 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;
 }

Please note that I assume that, if dirname is not an absolute path, you don't do any chdir()s between calling opendir( dirname ) and openfile( .... )

OTHER TIPS

You should not convert a struct dirent * to a FILE *. If you want the file name corresponding to a struct dirent, you can get it from this structure.

For example, if you have

struct dirent *dp = readdir(DIR directory);

then the file name of this directory entry is dp->d_name.

See readdir(3) for further details.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top