2014-03-05 79 views
1

我正在使用等效於ls和cd的C語言編寫文件瀏覽器,讓用戶瀏覽文件系統並選擇文件。這一切都運行良好 - 我可以儘可能的選擇一個struct dirent *,代表他們想要選擇的文件的目錄條目。但是,我想在我的程序中打開此文件,我知道如何做到這一點的唯一方法是通過fopen(FILE* fptr)。有沒有一種方法可以將struct dirent *轉換爲FILE*? A struct dirent有一個屬性ino_t d_fileno它指的是「文件序列號」 - 是否與文件描述符相同?我可以使用該文件描述符來打開FILE*嗎?C將struct dirent *轉換爲FILE *

回答

3

無法將'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不是絕對路徑,您不需要撥打opendir(dirname)openfile(....)之間的任何chdir()

0

您不應該將struct dirent *轉換爲FILE *。如果你想要一個struct dirent對應的文件名,你可以從這個結構中獲得。

舉例來說,如果你有

struct dirent *dp = readdir(...); 

那麼這個目錄項的文件名是dp->dname

查看readdir(3)瞭解更多詳情。

+0

您是指dp-> d_name? – sredmond

+0

@sredmond哎呀。你是對的。 –