Movatterモバイル変換


[0]ホーム

URL:


Skip to main content

This browser is no longer supported.

Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.

Download Microsoft EdgeMore info about Internet Explorer and Microsoft Edge
Table of contentsExit focus mode

Obtaining a File Name From a File Handle

  • 2021-01-07
Feedback

In this article

GetFinalPathNameByHandle, introduced in Windows Vista and Windows Server 2008, will return a path from a handle. If you need to do this on earlier releases of Windows, the following example obtains a file name from a handle to a file object using a file mapping object. It uses theCreateFileMapping andMapViewOfFile functions to create the mapping. Next, it uses theGetMappedFileName function to obtain the file name. For remote files, it prints the device path received from this function. For local files, it converts the path to use a drive letter and prints this path. To test this code, create amain function that opens a file usingCreateFile and passes the resulting handle toGetFileNameFromHandle.

#include <windows.h>#include <stdio.h>#include <tchar.h>#include <string.h>#include <psapi.h>#include <strsafe.h>#define BUFSIZE 512BOOL GetFileNameFromHandle(HANDLE hFile) {  BOOL bSuccess = FALSE;  TCHAR pszFilename[MAX_PATH+1];  HANDLE hFileMap;  // Get the file size.  DWORD dwFileSizeHi = 0;  DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi);   if( dwFileSizeLo == 0 && dwFileSizeHi == 0 )  {     _tprintf(TEXT("Cannot map a file with a length of zero.\n"));     return FALSE;  }  // Create a file mapping object.  hFileMap = CreateFileMapping(hFile,                     NULL,                     PAGE_READONLY,                    0,                     1,                    NULL);  if (hFileMap)   {    // Create a file mapping to get the file name.    void* pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1);    if (pMem)     {      if (GetMappedFileName (GetCurrentProcess(),                              pMem,                              pszFilename,                             MAX_PATH))       {        // Translate path with device name to drive letters.        TCHAR szTemp[BUFSIZE];        szTemp[0] = '\0';        if (GetLogicalDriveStrings(BUFSIZE-1, szTemp))         {          TCHAR szName[MAX_PATH];          TCHAR szDrive[3] = TEXT(" :");          BOOL bFound = FALSE;          TCHAR* p = szTemp;          do           {            // Copy the drive letter to the template string            *szDrive = *p;            // Look up each device name            if (QueryDosDevice(szDrive, szName, MAX_PATH))            {              size_t uNameLen = _tcslen(szName);              if (uNameLen < MAX_PATH)               {                bFound = _tcsnicmp(pszFilename, szName, uNameLen) == 0                         && *(pszFilename + uNameLen) == _T('\\');                if (bFound)                 {                  // Reconstruct pszFilename using szTempFile                  // Replace device path with DOS path                  TCHAR szTempFile[MAX_PATH];                  StringCchPrintf(szTempFile,                            MAX_PATH,                            TEXT("%s%s"),                            szDrive,                            pszFilename+uNameLen);                  StringCchCopyN(pszFilename, MAX_PATH+1, szTempFile, _tcslen(szTempFile));                }              }            }            // Go to the next NULL character.            while (*p++);          } while (!bFound && *p); // end of string        }      }      bSuccess = TRUE;      UnmapViewOfFile(pMem);    }     CloseHandle(hFileMap);  }  _tprintf(TEXT("File name is %s\n"), pszFilename);  return(bSuccess);}int _tmain(int argc, TCHAR *argv[]){    HANDLE hFile;    if( argc != 2 )    {        _tprintf(TEXT("This sample takes a file name as a parameter.\n"));        return 0;    }    hFile = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL,        OPEN_EXISTING, 0, NULL);    if(hFile == INVALID_HANDLE_VALUE)    {        _tprintf(TEXT("CreateFile failed with %d\n"), GetLastError());        return 0;    }    GetFileNameFromHandle( hFile );}

Related topics

Using File Mapping

GetFinalPathNameByHandle

 

 


Feedback

Was this page helpful?

YesNo

In this article

Was this page helpful?

YesNo