2009-05-06 7 views
3

stdio FILE * 포인터가 있으면 열린 파일의 이름을 찾을 수있는 방법이 있습니까?파일에서 (열린) 파일 이름 확인 *

+0

파일 설명자는 FILE *과 다른 정수입니다. 나는 당신이 FILE *의 관점에서 대답을 원한다고 가정하고 있지만, 당신은 당신의 제목을 편집하고 싶을지도 모른다. – mkb

답변

8

POSIX 시스템에서 fileno()를 사용하여 FILE *에서 파일 디스크립터를 가져올 수 있다고 생각한 다음 fstat를 사용하여 파일 디스크립터에서 통계 정보를 가져올 수 있습니다 (here). stat 구조는 장치 번호와 inode 번호를 포함합니다. 아이 노드와 일치하는 파일을 파일 시스템에서 확인할 수 있습니다. 이것은 분명히 물건으로 가득 찬 파일 시스템을위한 시간이 좀 걸릴 것입니다.

stdin 또는 stdout과 같은 스트림이거나 삭제 된 열린 파일 인 경우 스트림에 파일 이름이 없을 수 있다는 점이 실제로 가능하지 않습니다 (링크 된 기사에서 설명). 하드 링크 때문에 여러 개의 이름을 가질 수 있습니다.

링크 된 기사는이 문제의 불용성을 간략하게 설명하는 this comp.lang.c FAQ을 언급합니다.

편집 : 수정 해 주셔서 감사합니다.

+0

"당신은 할 수 없습니다"라는 대답에 감사드립니다. – Jamie

+1

fstat()는 파일 설명자가 열려있는 파일을 설명하는 데 사용됩니다. fileno()를 사용하여 파일 포인터에서 파일 설명자를 가져옵니다. 아이 노드가 발견되지 않았거나 하드 링크의 수에 따라 파일에 가능한 여러 이름이있을 수 있습니다. –

2

아니요, 없습니다. 그 외에도 FILE *은 명명 된 파일을 참조하지 않을 수 있습니다. 응용 프로그램에이 기능이 필요한 경우 열기 FILE *에서 열기 위해 사용한 파일 이름으로 맵 을 유지해야합니다.

1

표준 정의 된 휴대용 솔루션이 없습니다. 그러나 OS 제공 API 세트를 살펴볼 수 있습니다. POSIX 시스템에는 설명자 (FILE * 아님)를 사용하고 정보를 반환하는 fstat 함수가 있습니다.