2014-03-05 2 views
1

나는 파일 시스템을 탐색하고 파일을 선택할 수 있도록 ls와 cd에 해당하는 것을 사용하는 C에 파일 브라우저를 작성하고 있습니다. 모두 잘 작동합니다. 사용자가 선택한 파일의 디렉토리 항목을 나타내는 struct dirent *을 선택하는 한 얻을 수 있습니다. 그러나 내 프로그램에서이 파일을 열고 싶습니다. 그 방법을 알고있는 유일한 방법은 fopen(FILE* fptr)입니다. struct dirent *FILE*으로 변환 할 수있는 방법이 있습니까? struct dirent에는 "파일 일련 번호"를 나타내는 ino_t d_fileno 속성이 있습니다. 이는 파일 설명자와 동일합니까? 해당 파일 설명자를 사용하여 FILE*을 열 수 있습니까?C struct dirent *를 FILE로 변환합니다. *

답변

3

당신은 할 수 없습니다 '변환'첫 번째는 하나 명의 디렉토리 엔트리는 파일에 대한 액세스 권한이 있는지 여부는 파일, 서브 디렉토리 또는 뭔가 다른, 아무리 있는지에 상관없이 관련이 있기 때문에 FILE *struct dirent * 및 그래서 당신은 열어 놓은 파일에 대해서만 FILE *을 가질 수 있습니다. 또한. 이 아이 노드가 있어요하여 파일을 열 수있는 방법은 없다 당신이 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(....)

0

struct dirent *FILE *으로 변환하면 안됩니다. struct dirent에 해당하는 파일 이름을 원하면이 구조에서 가져올 수 있습니다. 예를 들어

, 당신은

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

이있는 경우는이 디렉토리 엔트리의 파일 이름은 dp->dname입니다.

자세한 내용은 readdir(3)을 참조하십시오.

+0

당신이 dp-> d_name 의미합니까 호출 사이의 chdir()들하지 않는다, 나는 가정 있습니다? – sredmond

+0

@sredmond 죄송합니다. 당신 말이 맞아요. –