2010-11-28 8 views
2

주어진 파일 핸들에서 파일 이름을 검색하려고합니다.C에서 Windows의 파일 핸들에서 파일 이름을 가져 오는 방법은 무엇입니까?

나는 GetFileInformationByHandle이 유용 할 수 있지만 반환하는 구조에는 파일 이름 정보 (http://msdn.microsoft.com/en-us/library/aa363788%28v=VS.85%29.aspx)가 포함되어 있지 않은 것으로 나타났습니다.

어떻게하면됩니까?

편집 : 나는 GetFileInformationByHandleEx Windows XP에서 작업을 진행하기 위해 Windows FileID에 API를 설치하려고했습니다

. 그러나 포함 fileextd.h 나는 다음과 같은 오류가 다음 코드에서

c:\programmi\microsoft visual studio 9.0\vc\include\fileextd.h(16) : error C2011: '_FILE_INFO_BY_HANDLE_CLASS' : 'enum' type redefinition 
     c:\programmi\microsoft sdks\windows\v6.1\include\winbase.h(13900) : see declaration of '_FILE_INFO_BY_HANDLE_CLASS' 
c:\programmi\microsoft visual studio 9.0\vc\include\fileextd.h(32) : error C2011: '_FILE_BASIC_INFO' : 'struct' type redefinition 
     c:\programmi\microsoft sdks\windows\v6.1\include\winbase.h(13917) : see declaration of '_FILE_BASIC_INFO' 
c:\programmi\microsoft visual studio 9.0\vc\include\fileextd.h(40) : error C2011: '_FILE_STANDARD_INFO' : 'struct' type redefinition 
     c:\programmi\microsoft sdks\windows\v6.1\include\winbase.h(13925) : see declaration of '_FILE_STANDARD_INFO' 
c:\programmi\microsoft visual studio 9.0\vc\include\fileextd.h(48) : error C2011: '_FILE_NAME_INFO' : 'struct' type redefinition 
     c:\programmi\microsoft sdks\windows\v6.1\include\winbase.h(13933) : see declaration of '_FILE_NAME_INFO' 
c:\programmi\microsoft visual studio 9.0\vc\include\fileextd.h(53) : error C2011: '_FILE_RENAME_INFO' : 'struct' type redefinition 
     c:\programmi\microsoft sdks\windows\v6.1\include\winbase.h(13938) : see declaration of '_FILE_RENAME_INFO' 
c:\programmi\microsoft visual studio 9.0\vc\include\fileextd.h(60) : error C2011: '_FILE_ALLOCATION_INFO' : 'struct' type redefinition 
     c:\programmi\microsoft sdks\windows\v6.1\include\winbase.h(13945) : see declaration of '_FILE_ALLOCATION_INFO' 
c:\programmi\microsoft visual studio 9.0\vc\include\fileextd.h(64) : error C2011: '_FILE_END_OF_FILE_INFO' : 'struct' type redefinition 
     c:\programmi\microsoft sdks\windows\v6.1\include\winbase.h(13949) : see declaration of '_FILE_END_OF_FILE_INFO' 
c:\programmi\microsoft visual studio 9.0\vc\include\fileextd.h(68) : error C2011: '_FILE_STREAM_INFO' : 'struct' type redefinition 
     c:\programmi\microsoft sdks\windows\v6.1\include\winbase.h(13953) : see declaration of '_FILE_STREAM_INFO' 
c:\programmi\microsoft visual studio 9.0\vc\include\fileextd.h(76) : error C2011: '_FILE_COMPRESSION_INFO' : 'struct' type redefinition 
     c:\programmi\microsoft sdks\windows\v6.1\include\winbase.h(13961) : see declaration of '_FILE_COMPRESSION_INFO' 
c:\programmi\microsoft visual studio 9.0\vc\include\fileextd.h(85) : error C2011: '_FILE_ATTRIBUTE_TAG_INFO' : 'struct' type redefinition 
     c:\programmi\microsoft sdks\windows\v6.1\include\winbase.h(13970) : see declaration of '_FILE_ATTRIBUTE_TAG_INFO' 
c:\programmi\microsoft visual studio 9.0\vc\include\fileextd.h(90) : error C2011: '_FILE_DISPOSITION_INFO' : 'struct' type redefinition 
     c:\programmi\microsoft sdks\windows\v6.1\include\winbase.h(13975) : see declaration of '_FILE_DISPOSITION_INFO' 
c:\programmi\microsoft visual studio 9.0\vc\include\fileextd.h(94) : error C2011: '_FILE_ID_BOTH_DIR_INFO' : 'struct' type redefinition 
     c:\programmi\microsoft sdks\windows\v6.1\include\winbase.h(13979) : see declaration of '_FILE_ID_BOTH_DIR_INFO' 
c:\programmi\microsoft visual studio 9.0\vc\include\fileextd.h(130) : error C2011: '_FILE_ID_TYPE' : 'enum' type redefinition 
     c:\programmi\microsoft sdks\windows\v6.1\include\winbase.h(14026) : see declaration of '_FILE_ID_TYPE' 
c:\programmi\microsoft visual studio 9.0\vc\include\fileextd.h(135) : error C2011: 'FILE_ID_DESCRIPTOR' : 'struct' type redefinition 
     c:\programmi\microsoft sdks\windows\v6.1\include\winbase.h(14032) : see declaration of 'FILE_ID_DESCRIPTOR' 
c:\documents and settings\lab\documenti\visual studio 2008\projects\sandbox\sandbox\funcs_files.cpp(26) : error C2079: 'lpFileInformation' uses undefined struct '_FILE_NAME_INFO' 
c:\documents and settings\lab\documenti\visual studio 2008\projects\sandbox\sandbox\funcs_files.cpp(35) : error C2228: left of '.FileName' must have class/struct/union 
     type is 'int' 

을받을 때 당신이 핸들에서 파일 이름을 필요로하는 경우

#include <windows.h> 
#include <fileextd.h> 

LPVOID GetFileNameFromHandle(HANDLE hFile) { 
    FILE_NAME_INFO lpFileInformation; 
    BOOL bWorked; 

    bWorked = GetFileInformationByHandleEx(
     hFile, 
     FileNameInfo, 
     &lpFileInformation, 
     sizeof(FILE_NAME_INFO)); 

    return lpFileInformation.FileName; 
} 

답변

0

어디에서 파일 핸들을 가져 왔습니까? 명명 된 파이프 핸들이 아닌 것으로 확신하는 경우 NtQueryObject을 사용하여 파일 이름을 쿼리 할 수 ​​있습니다.

1

Windows XP에서 파일과 디렉터리 모두에서 올바르게 작동하는 올바른 방법이 있습니다. 다른 게시 here에서 설명했습니다.

Vista의 경우
2
BOOL GetFileNameFromHandle(HANDLE hFile, TCHAR *pszFileName, const unsigned int uiMaxLen) 
{ 
    pszFileName[0]=0; 

    std::unique_ptr<TCHAR> ptrcFni(new TCHAR[_MAX_PATH + sizeof(FILE_NAME_INFO)]); 
    FILE_NAME_INFO *pFni = reinterpret_cast<FILE_NAME_INFO *>(ptrcFni.get()); 

    BOOL b = GetFileInformationByHandleEx(hFile, 
             FileNameInfo, 
             pFni, 
             sizeof(FILE_NAME_INFO) + (_MAX_PATH * sizeof(TCHAR))); 
    if (b) 
    { 
#ifdef _UNICODE 
     wcsncpy_s(pszFileName, 
       min(uiMaxLen, (pFni->FileNameLength/sizeof(pFni->FileName[0])) + 1), 
       pFni->FileName, 
       _TRUNCATE); 
#else 
     strncpy_s(pszFileName, 
       min(uiMaxLen, (pFni->FileNameLength/sizeof(pFni->FileName[0])) + 1), 
       CW2A(pFni->FileName), 
       _TRUNCATE); 
#endif 
    } 
    return b; 
} 
0

이후

그것은 IMO 더 편리하고 GetFileInformationByHandleEx보다 더 많은 사용자 정의 할 수 있습니다 (같은 메흐 다드 쓴) GetFinalPathNameByHandle에서 살펴보고, 그것은 사용자 정의 크기 FILE_NAME_INFO를 할당하는 번거 로움을 제거 구조체.

예 :

DWORD size = GetFinalPathNameByHandleW(handle, NULL, 0, VOLUME_NAME_DOS); 
if (size == 0) return L"(NOT FOUND)"; 
std::wstring fname(size, L'0'); 
size = GetFinalPathNameByHandleW(handle, &fname.front(), size, VOLUME_NAME_DOS); 

공지 사항, 그것은 반환 이름으로 \\?\ 앞에 추가됩니다.

(저는 메모리 처리를 위해 C 보일러 플레이트를 피하기 위해 C++ std :: wstring을 사용합니다. 필요에 따라 malloc을 사용하십시오).

관련 문제