programing

열려 있는 파일 구조에서 파일 핸들을 가져오려면 어떻게 해야 합니까?

codeshow 2023. 8. 30. 22:17
반응형

열려 있는 파일 구조에서 파일 핸들을 가져오려면 어떻게 해야 합니까?

fopen함수는 포인터를 반환합니다.FILE내용이나 의미를 다루지 않고 불투명한 값으로 간주해야 하는 구조입니다.

Windows에서 C 런타임은 Windows API의 래퍼입니다.fopen기능은 다음에 의존합니다.CreateFile기능. 그.CreateFile함수는 a를 반환합니다.HANDLE다른 윈도우즈 API에서 사용하는 파일입니다.

이제, 나는 윈도우 API를 사용하는 라이브러리의 깊숙한 곳에서fopen그리고.FILE*그래서: 그것을 얻을 수 있는 방법이 있습니까?HANDLE에서FILE구조?컴파일러마다 다르므로 MSVC 런타임 라이브러리를 의미합니다.

저는 이것이 못생긴 휴대용 해킹이 될 것이고, 만약 마이크로소프트가 내부 포맷을 변경한다면 그것은 깨질 수도 있다는 것을 이해합니다.FILE하지만 저는 폐쇄형 시스템(즉, Windows CE 내장형 시스템)에서 개발 중이며 라이브러리를 리팩터링하는 것은 어렵고 시간이 많이 걸릴 것입니다.

사용하다_fileno다음에_get_osfhandle잊지 마세요_close당신이 끝나면 그것.

편집: 그것이 무엇인지 확실하지 않습니다._get_osfhandle는 WinCE에서 지원됩니다.그러나 WinCE의 문서는_fileno"파일 핸들"이 아닌 "파일 핸들"을 반환한다고 말합니다.YMMV 하지만 이것은 당신이 그냥 사용할 수 있다는 것을 암시합니다._fileno값을 WinCE에서 핸들로 직접 반환합니다.

편집: #2 그 이론은 이 사람의 경험에 의해 뒷받침됩니다.

"제가 1월 29일에 목록에 올린 헤더 파일을 보시면 제가 파일 생성/처리 문제를 어떻게 처리했는지 알 수 있습니다.모든 FILE* 항목을 HANDLE로 교체할 필요가 없었습니다.fileio.cpp의 다음 스니펫을 참조하십시오.

#ifndef q4_WCE

  FlushFileBuffers((HANDLE) _get_osfhandle(_fileno(_file)));
  HANDLE h = ::CreateFileMapping((HANDLE)
_get_osfhandle(_fileno(_file)),
                        0, PAGE_READONLY, 0, len, 0);
#else

  FlushFileBuffers((HANDLE) _fileno(_file));
  HANDLE h = ::CreateFileMapping((HANDLE) _fileno(_file),
                    0, PAGE_READONLY, 0, len, 0);
#endif //q4_WCE

_fileno가 핸들을 반환하는 것으로 나타났습니다.캐스팅만 하면 됩니다."

리눅스에는 다음과 같은 것들이 있습니다.int fileno(FILE *);파일 설명자(낮은 수준에서 반환된 것)를 반환하는 함수open기능)에서FILE*.

윈도우에 적용이 되고 핸들을 돌려주는지는 모르겠지만요?

C를 위해서, 이것을 시도해 보세요.

HANDLE foo = (HANDLE)_get_osfhandle(fileno(fopen("bar.txt", "w")));

언급URL : https://stackoverflow.com/questions/3989545/how-do-i-get-the-file-handle-from-the-fopen-file-structure

반응형